Mongoosej在for循环中使用promise



我有两个集合:问题和答案。每个答案都属于一个问题,因此一个答案有其"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});
    });
});

相关内容

  • 没有找到相关文章

最新更新