我有两个集合:问题和答案。每个答案都属于一个问题,所以答案的答案是" 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。
我怎样才能完成它?
我遇到的另一个问题是,使用聚合查询,我只能提出至少有一个答案的问题。如何在没有回答的情况下得到问题?
答案 0 :(得分:1)
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);
});
答案 1 :(得分:0)
更好的方法是使用像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});
});
});