nodejs中的多个异步mongo请求

时间:2013-05-21 01:52:26

标签: javascript node.js mongodb asynchronous

如何连续编写多个查询?

喜欢

Space.findOne({ _id: id }, function(err, space) {
    User.findOne({ user_id: userid }, function(err, user) {
        res.json({ space: space, user: user});
    });
});
对于更多请求和逻辑,

看起来不太好

如何正确完成?

我听到了有关这个承诺的事情,但我不知道。

由于

3 个答案:

答案 0 :(得分:7)

当我遇到类似问题时,我使用了async库。

async.parallel([
    function(callback){
       Space.findOne({ _id: id }, callback);
    },
    function(callback){
        User.findOne({ user_id: userid },callback);
    }
],
function(err, results){
    res.json({space:results[0],user:results[1]});
});

如果您想要顺序执行,也可以使用async.series。

答案 1 :(得分:3)

@ Benjamin的方法是正确的。 Mongoose还提供populate方法,该方法通过id获取彼此相关的多个对象。这也是并行发生的,是多个查询的特例。有关更多示例,请参阅http://mongoosejs.com/docs/populate.html

答案 2 :(得分:1)

如果你使用支持Promises的Node.js 4+,你可以将查询包装在一个promise中。

queryPromise = function(findQueryCursor) {
  return new Promise(function(resolve, reject) {
    findQueryCursor.toArray(function(err, data) {
      resolve(data);
    });
  });
};

然后,创建一个由查询组成的Promise数组:

promiseAr = [];
promiseAr.push(
  queryPromise(
    db.collection('dbname').find(query1)
  )
);
promiseAr.push(
  queryPromise(
    db.collection('dbname').find(query2)
  )
);

然后致电

Promise.all(promiseAr)
.then(function(dataArray) {
   // results of query1 in dataArray[0]
   // results of query2 in dataArray[1]
})
.catch(function(err) {
   // catch errors
});

查询将与MongoDB并行发送,并且在完成所有查询后将调用“.then”函数。

你必须这样做的原因是因为.find()函数返回一个游标,然后你必须调用.toArray()来检索数据。 .toArray()本身是异步的,所以如果你想使用Promise.all,你必须将它包装在Promise中。