Javascript NodeJs:使用来自另一个集合的结果筛选mongo查询结果

Javascript NodeJs:使用来自另一个集合的结果筛选mongo查询结果,javascript,arrays,node.js,callback,mongodb-query,Javascript,Arrays,Node.js,Callback,Mongodb Query,在这种情况下,我需要对来自mongo集合(a)的一组不同的值执行逻辑,然后将结果保存到另一个集合(B)。然而,(A)的内容会随着时间的推移而改变,因此我只想对(A)中没有(B)中相应文档的那些文档执行逻辑。由于不支持连接,我尝试在节点级别执行此操作。我正在查询集合(A)中的所有项目,并使用findOne查找集合(B)中的相应条目。如果我找到了它,我想将其从数组中删除,但我被卡住了,因为findOne使用了一个异步回调,它似乎不适用于数组filter方法。有没有更好的方法来做到这一点: funct

在这种情况下,我需要对来自mongo集合(a)的一组不同的值执行逻辑,然后将结果保存到另一个集合(B)。然而,(A)的内容会随着时间的推移而改变,因此我只想对(A)中没有(B)中相应文档的那些文档执行逻辑。由于不支持连接,我尝试在节点级别执行此操作。我正在查询集合(A)中的所有项目,并使用
findOne
查找集合(B)中的相应条目。如果我找到了它,我想将其从数组中删除,但我被卡住了,因为
findOne
使用了一个异步回调,它似乎不适用于数组
filter
方法。有没有更好的方法来做到这一点:

function loadNewDocumentsFromDB(callback){
  db.collection('A', function(err, acollection){    
    bcollection.find().toArray(function(err, arr){
      if(arr){
        // toQuery is the global array to be used elsewhere
        toQuery = arr.map(function(config){
          transformed = 
          {
            args: config._id, // these args are a doc representing a unique entry in 'B'
            listings: config.value.id.split(',') // used by other functions
          };

          return transformed;
        })
        .filter(function(transformed){
          db.collection('B', function(err, bcollection){
          bcollection.findOne(transformed.args, function(err, doc){
            // I want these values returned from the filter function not the callback
            if(doc){
              return false; // want to remove this from list of toQuery
            }else{
              return true; // want to keep in my list
          });
        });
      }
      callback();
    });
  }); 
}

更好的方法是在数据库上执行此操作。检查2次执行是否对您有用。
有关更多信息,请参见

这是我如何使其工作的:

function loadOptionsFromDB(callback){
  toQuery = [];
  db.collection('list', function(err, list){    
    db.collection('data', function(err, data){
      list.find().each(function(err, doc){
        if(doc){ 
          transformed = 
            {
              args: doc._id,
              listings: doc.value.id.split(',')
            };
          (function(obj){       
            data.findOne(obj.args, function(err, found){
              if(found){}
              else{
                toQuery.push(obj);
              }
            });
          })(transformed);
        }else{
      //Done finding
          setTimeout(callback, 20000);
        }
      });       
    });
  }); 
}

我认为这将是最好的长期工作,因为我的数据集将继续增长。短期内,通过使用游标的每个迭代器构建数组,我成功地实现了这一点。我稍后会发布我的代码。