我想基于猫鼬查询来过滤数组。但是,我对node.js和异步编程还比较陌生。我知道Array.prototype.filter是一个同步函数,猫鼬查询是异步的。
在此网站上搜索时,遇到了以下两种解决方案:
filtering an array with a function that returns a promise-但这看起来很复杂,我还不了解这个概念。
how to wait for the result of a mongoose query?-首先,此解决方案看起来很容易理解,所以我尝试了一下
这是基于第二种方法的示例代码:
exports.create = function(req, res) {
async.filter(req.body.data.entries, function(item, callback){
MyCollection.findOne({'_id': item.id}, function(err, doc) {
callback(err == null && doc != null);
});
},
function(results){
req.body.data = results
// default controller to create a document in Mongo DB
return controller.create(Model, req, res);
});
};
但是,这似乎不起作用。 results
不对应于答案中所述的过滤列表,而是完全对应于回调函数的布尔表达式的结果。我还在当前的异步文档中进行了检查,以查看filter函数中是否有任何更改,但是没有看到任何更改。
答案 0 :(得分:0)
嗯,还有另一种方法。而不是让行处于异步状态。您可以从数据库中筛选出所有记录。 mongodb中有一个$ in的概念。您可以使用它一次检索具有特定ID的多个记录。就您而言,这是示例
exports.create = function(req, res) {
var ids = []
req.body.data.entries.forEach(function (item) {
ids.push(item.id);
});
MyCollection.findOne({'_id': {$in: ids}}, function (err, docs) {
// here you have all your filter data
var myDocs = docs;
//Callback from here to return data
});
}