3

如何连续编写多个查询?

像一个

Space.findOne({ _id: id }, function(err, space) {
    User.findOne({ user_id: userid }, function(err, user) {
        res.json({ space: space, user: user});
    });
});

有更多的请求和逻辑看起来不太好

它是如何正确完成的?

我听说了一些关于承诺的事情,但我不知道。

谢谢

4

3 回答 3

7

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

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。

于 2013-05-21T01:57:09.453 回答
3

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

于 2013-05-21T02:44:33.097 回答
3

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

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

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

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 中。

于 2017-06-29T14:35:38.293 回答