![](/img/trans.png)
[英]Query data in one collection based on data in another collection in MongoDB
[英]filter collection based on mongodb query
我有一个要使用MongoDB输出过滤的集合。 我的问题是,每个请求我都会收到一个无法用于过滤的承诺。 在继续前进之前,如何解决所有未完成的承诺?
我当前的方法是使用lodash生成一个集合,将输入作为键,将MongoDB输出作为值( 此处描述的方法),通过公用键合并这两个集合( 此处描述的方法),然后在新字段注释为空时过滤条目。 当前它不起作用,因为在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')
猫鼬查询异步响应,因此必须相应地处理它们的响应。
幸运的是, query.exec()
返回一个promise,使您可以做到这一点。
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)
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.