Mongoosejs在for循环中使用promise

时间:2016-08-06 20:42:44

标签: javascript node.js mongodb mongoose aggregation-framework

我有两个集合:问题和答案。每个答案都属于一个问题,所以答案的答案是" 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。

我怎样才能完成它?

我遇到的另一个问题是,使用聚合查询,我只能提出至少有一个答案的问题。如何在没有回答的情况下得到问题?

2 个答案:

答案 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});
    });
});