2017-10-10 15 views
0

MongoDB出力を使用してフィルタリングしたいコレクションがあります。 私の問題はそれぞれのリクエストに対して、私は約束を保留しています。これはフィルタリングに使用できません。移動する前にすべての保留中の約束を解決するには?mongodbクエリに基づくフィルタコレクション

私の現在のアプローチは、(アプローチはhereを記載)の値としてキーとMongoDBの出力として入力してコレクションを生成するlodashを使用した共通鍵により、これら2つのコレクションをマージする(アプローチがhereを記載)、次いでときに新しいフィールドエントリをフィルタリングすることですコメントは空です。現在、Mongodbのリクエスト中に約束が保留されているため、動作しません。

ありがとうございました。

注:接続、スキーマやモデルがすでに正常に動作している

import _ from 'lodash' 
import Mongoose from 'mongoose'; 

Mongoose.Promise = global.Promise; 

var input = [{'id':'1', 'text':'a'},{'id':'2', 'text':'b'},...] 
var ids = _.map(input,'id') 
var filtering = _.zipObject(ids, _.map(ids, function(id) { 
    var query = Model.find({ id: id }).select({ comment: 1 }); 
    query.exec(); 
    return query 
})); 

// output is currently [{'id':'1','comment':Promise { <pending> },},{'id':'2','comment':Promise { <pending> },},...] 
// output should be [{'id':'1','comment':'blabla',},{'id':'2','comment':'',},...] 
var output= _({}).merge(_(input).groupBy("id").value(),_(filtering).groupBy("id").value()) 
    .values() 
    .flatten() 
    .value(); 
output = _.filter(output, 'comment') 

答えて

0

マングースのクエリは非同期に対応し、その応答はそれに応じて処理する必要があります。

幸運なことに、query.exec()は約束を返してくれています。

var input = [{'id':'1', 'text':'a'}, {'id':'2', 'text':'b'}, ...]; 
var promises = input.map(function(dataObj) { 
    return Model.find({ 'id': dataObj.id }).select({ comment: 1 }).exec() 
    .then(function(comment) { 
     return { 'id':dataObj.id, 'comment':comment }; 
    }); 
}); 
Promise.all(promises).then(function(results) { 
    // do something with `results` (all that lodash stuff) 
}); 
関連する問題