2017-10-10 14 views
0

MongoDB 출력을 사용하여 필터링하고 싶은 컬렉션이 있습니다. 내 문제는 각 요청에 대해 필터링에 사용할 수없는 약속이 보류 중입니다. 계속 진행하기 전에 모든 보류중인 약속을 해결하는 방법?mongodb 쿼리를 기반으로하는 필터 모음

내 현재의 접근법은 항목을 필터링 한 다음 공통 키에 의해 두 모음 (접근법 here 설명) 병합 값 키 MongoDB의 출력 (접근법 here을 기재)로서 입력 된 컬렉션을 생성 lodash를 사용하는 경우에는 새로운 분야 댓글이 비어 있습니다. 현재 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) 
});