如何连续编写多个查询?
喜欢
Space.findOne({ _id: id }, function(err, space) {
User.findOne({ user_id: userid }, function(err, user) {
res.json({ space: space, user: user});
});
});
对于更多请求和逻辑,看起来不太好
如何正确完成?
我听到了有关这个承诺的事情,但我不知道。
由于
答案 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中。