【问题标题】:Using Async Parallel for multiple MongoDB aggregate functions对多个 MongoDB 聚合函数使用 Async Parallel
【发布时间】:2018-02-28 11:51:43
【问题描述】:

您好,我需要执行多个聚合查询,并将结果呈现到视图中。我现在的问题是弄清楚如何确保所有查询在渲染之前完成,我遇到了 async.parallel。我一直试图弄乱它,但它不起作用。例如,这就是我现在拥有的。

    var async = require('async');
    async.parallel({
    one: function(){
        Country.aggregate([
            {
                $match: {
                name: { $in: ["USA", "China", "India", "France", "Japan"]},
                }
            },
            {
                $sort: {
                    year: 1
                }
            },
            {
                $group: {
                    _id: '$name',
                    nominalGDP: {$push: "$nominalGDP"}
                }
            }, 
            {
                $project: {
                _id: 0,
                name: "$_id",
                nominalGDP: 1
                }
            }
            ], function(err, recs){
            if(err){
                console.log(err);
            } else {
                console.log(recs);
            }
        });
    },

    two: function(){
        Country.aggregate([
            {           
                $match: {
                    $and: [
                        {name: { $in: ["USA", "China", "India", "France", "Japan"]}},
                        {year: 2017}
                    ]
                }
            },
            {
                $sort: {
                    "nominalGDP": -1
                }
            },
            {
                $project: {
                _id: 0,
                name: 1,
                'y' : '$nominalGDP'
                }
            }       
            ], function(err, recs){
            if(err){
                console.log(err);
            } else {
                console.log(recs);
            }
        });
    }
}, function(err, results){
    res.render('random', { title: 'Test', data: results.one, pie: results.two });
});

所以我有两个聚合函数,每个函数都会产生它们的结果。这两个函数正在正确打印它们的结果,但没有数据被渲染到我的视图(随机)。

【问题讨论】:

  • 您期望results.oneresults.two 会是什么?这两个函数都没有返回任何内容,那么,您如何期望结果在function(err, results) 中可用?
  • one: function(){ 更改为 one: function(callback){ ... 而不是 function(err, recs){ .... } 替换为 callback ... 重复 two
  • 哦,我明白了。好吧,只需像 h1b9b 和 Jaromanda X 所说的那样添加“回调”就可以了,非常感谢

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


【解决方案1】:

任务以callback 函数作为参数
所以从一个任务返回的数据,它应该看起来像

task: function(callback) {
   ...
   callback(null, result);
}

在这种情况下,您可以使用callback 作为Country.aggregate 的第二个参数

【讨论】:

  • 或者,对于问题中的代码,不要使用function(err, recs) { .... },而是使用callback
【解决方案2】:

Parllel 需要一个回调函数,以确保该函数已完全执行,现在该返回了。

即使回调也需要 2 个参数, 1. Err(如果成功则为空) 2. 数据(需要发送成功)

var async = require('async');
    async.parallel({
    one: function(cb){
        Country.aggregate([
            {
                $match: {
                name: { $in: ["USA", "China", "India", "France", "Japan"]},
                }
            },
            {
                $sort: {
                    year: 1
                }
            },
            {
                $group: {
                    _id: '$name',
                    nominalGDP: {$push: "$nominalGDP"}
                }
            }, 
            {
                $project: {
                _id: 0,
                name: "$_id",
                nominalGDP: 1
                }
            }
            ], function(err, recs){
            if(err){
               cb(err);
            } else {
               cb (null , recs);
            }
        });
    },

    two: function(cb){
        Country.aggregate([
            {           
                $match: {
                    $and: [
                        {name: { $in: ["USA", "China", "India", "France", "Japan"]}},
                        {year: 2017}
                    ]
                }
            },
            {
                $sort: {
                    "nominalGDP": -1
                }
            },
            {
                $project: {
                _id: 0,
                name: 1,
                'y' : '$nominalGDP'
                }
            }       
            ], function(err, recs){
            if(err){

                cb(err);
            } else {
               cb(null, recs);
            }
        });
    }
}, function(err, results){
    res.render('random', { title: 'Test', data: results.one, pie: results.two });
});

您可以阅读更多详细信息 https://github.com/caolan/async/blob/v1.5.2/README.md#parallel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多