基于mongodb查询的过滤器集合

时间:2017-10-10 14:37:24

标签: javascript mongodb mongoose promise lodash

我有一个我想用MongoDB输出过滤的集合。 我的问题是每个请求我得到一个不能用于过滤的承诺。在继续之前如何解决所有待处理的承诺?

我目前的方法是使用lodash生成一个集合,其中输入为键,MongoDB输出为值(方法描述为here),通过公共密钥合并这两个集合(方法描述为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')

1 个答案:

答案 0 :(得分:0)

Mongoose查询以异步方式响应,并且必须相应地处理它们的响应。

幸运的是,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)
});