我有两个集合:问题和答案。每个答案都属于一个问题,因此一个答案有其"question_id"。
我喜欢得到五个答案最多的问题:
Answer.aggregate([
{
$group: {
_id: '$question_id',
num_questions: { $sum: 1 },
}
},
{
$sort: {
'num_questions': -1
}
}
]).then(function(answers) {
var result = [];
for(answer of answers) {
Question.findById(answer._id, function(err, question) {
result.push(question);
});
}
console.log(result);
res.json({questions: result});
});
但是使用上面的代码,由于异步机制,我的结果将为null。
我该怎么做?
我遇到的另一个问题是,对于聚合查询,我只能有至少一个答案的问题。我怎么能在没有答案的情况下得到问题?
Answer.aggregate([
{
$group: {
_id: '$question_id',
num_questions: { $sum: 1 },
}
},
{
$sort: {
'num_questions': -1
}
}
]).then(function(answers) {
var result = [];
var count = 0;
for(answer of answers) {
Question.findById(answer._id, function(err, question) {
count++
result.push(question);
if (count == 5) {
res.json({questions: result});
}
});
}
console.log(result);
});
更好的方法是使用像Q这样的Promise库,它可以帮助您完成这些任务。有了Q,很容易等到所有承诺都得到解决,而不需要使用额外的恶作剧(比如使用计数变量(。。
Answer.aggregate([
{
$group: {
_id: '$question_id',
num_questions: {$sum: 1}
}
},
{
$sort: {
'num_questions': -1
}
}
]).then(function (answers) {
var promises = [];
for (answer of answers) {
promises.push(Question.findById(answer._id).exec());
}
Q.all(promises).then(function(questions) {
res.json({'questions': questions});
});
});