【问题标题】:filter collection based on mongodb query基于mongodb查询的过滤集合
【发布时间】:2018-03-22 00:31:30
【问题描述】:

我有一个想要使用 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')

【问题讨论】:

    标签: javascript mongodb mongoose promise lodash


    【解决方案1】:

    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)
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2021-02-26
      • 2016-11-22
      • 1970-01-01
      • 2020-11-05
      • 2015-03-06
      • 2018-07-22
      相关资源
      最近更新 更多