要在Mongoose中进行并行“查询”

时间:2013-07-10 07:38:42

标签: node.js mongodb mongoose

我对Mongoose很新,所以请耐心等待。

有没有办法在“并行”中执行两个查询。或者至少查询两个文档并将结果一起返回?回调表示法让我在同步时稍微绊倒了。

在伪代码中,这就是我要找的东西:

function someWork(callback) {   
    var task1 = service.doQueryAndReturnTask();   
    var task2 = service.doQueryAndReturnTask();

    waitAll(task1, task2);

    callback(task1, task2); 
}

我知道这不是解决方案,因为需要在doQueryAndReturnTask上进行回调,但我需要一个有效且可引用的模式并不链接回调

2 个答案:

答案 0 :(得分:12)

这不是关于猫鼬。 Node.js是一种异步语言,因此它允许您同时执行任意数量的异步任务(例如,查询数据库)。

您需要的是一些用于处理异步控制流的lib,例如async.jswhen.js

var when = require('when');

var someWork = function(callback) {
  when.all([
    collection1.find(query1).exec(),
    collection2.find(query2).exec()
  ]).spread(callback)
    .otherwise(function(err) {
      // something went wrong
    });
};

when.js是处理承诺的模块。因此,如果您不需要承诺,则可以改为使用async.js

var async = require('async');

var someWork = function(callback) {
  async.parallel([
    function(cb) { collection1.find(query1, cb) },
    function(cb) { collection2.find(query2, cb) }
  ], function(err, res) {
    if (!err) return callback.apply(null, data);
    // something went wrong
  });
};

更新: Promise是通过使用promises包装异步函数来处理异步控制流的替代方法。

通常,为了获得某些异步函数的结果,你应该传递一些将在未来某处执行的回调。

当你使用promises,而不是传递一些回调时,你会立即得到执行结果的承诺,这些结果将在未来的某个地方得到解决。

因此,promises允许您使用promises而不是真实数据以同步方式使用异步函数。 Promises还允许您在执行的任何时候等待结果。

在我的例子中,我正在执行两个查询,获得两个结果的承诺。然后我告诉节点要等到两个承诺都完成后再将结果传递给callback函数。

您可以阅读promises/A+ specification here。您也可以查看when.js api docs

答案 1 :(得分:1)

如今,可以使用Promise.all

来实现
Promise.all([
  collection1.find({foo: 'bar'}),
  collection2.find({fooey: 'bazzy'})
]).then(([fooResults, fooeyResults]) => {
  console.log('results: ', fooResults, fooeyResults);
}).catch((err) => {
  console.log('Error: ', err);
});