如何使用猫鼬查询的结果过滤数组?

时间:2018-09-13 15:35:32

标签: node.js asynchronous mongoose

我想基于猫鼬查询来过滤数组。但是,我对node.js和异步编程还比较陌生。我知道Array.prototype.filter是一个同步函数,猫鼬查询是异步的。

在此网站上搜索时,遇到了以下两种解决方案:

  1. filtering an array with a function that returns a promise-但这看起来很复杂,我还不了解这个概念。

  2. 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函数中是否有任何更改,但是没有看到任何更改。

1 个答案:

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

  }