nodejs中多个asynchronousmongo请求

如何在一行中编写多个查询?

像一个

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

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

它是如何正确地完成的?

我听到了诺言,但我不知道。

谢谢

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

 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。

@本杰明的做法是正确的。 Mongoose还提供了populate方法,它可以通过它们的id获取彼此相关的多个对象。 这也同时发生,是多个查询的特例。 有关更多示例,请参阅http://mongoosejs.com/docs/populate.html

如果您使用支持Promise的Node.js 4+,则可以将查询包装在承诺中。

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

然后,创build一个由查询组成的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()本身是asynchronous的,所以如果你想使用Promise.all,你必须把它包装在一个Promise中。