Asynchronous Node.js模块async.series工作不正常

Asynchronous Node.js模块async.series工作不正常,asynchronous,mongodb-query,async.js,Asynchronous,Mongodb Query,Async.js,我正在开发MongoDB 2.6.9和NodeJs 0.10.37,我有一个收集卷,这意味着飞行 根据我之前的研究,我收集了大量的vols,其中包含以下样本: > db.vols.findOne() { "_id" : ObjectId("5717a5d4578f3f2556f300f2"), "Orig" : "PTH", "Dest" : "GMP", "Flight" : 126, "Stops" : 0, "Seats" : 169,

我正在开发MongoDB 2.6.9和NodeJs 0.10.37,我有一个收集卷,这意味着飞行

根据我之前的研究,我收集了大量的
vols
,其中包含以下样本:

> db.vols.findOne()
{
    "_id" : ObjectId("5717a5d4578f3f2556f300f2"),
    "Orig" : "PTH",
    "Dest" : "GMP",
    "Flight" : 126,
    "Stops" : 0,
    "Seats" : 169,
    "Ops_Week" : 3,
    "Eff_Date" : "2016-04-14",
    "Mkt_Al" : "XX",
    "Dep_Time" : 1110,
    "Thru_Point" : "",
    "Arr_Time" : 1600,
    "Block_Mins" : 230

}
下一个文档,是指一个带有停止的航班

> db.vols.findOne({Stops:1})
{
    "_id" : ObjectId("5717a5d4578f3f2556f301c5"),
    "Orig" : "CIM",
    "Dest" : "LKR",
    "Flight" : 7756,
    "Stops" : 1,
    "Seats" : 70,
    "Ops_Week" : 2,
    "Eff_Date" : "2016-04-11",
    "Mkt_Al" : "YY",
    "Dep_Time" : 1655,
    "Thru_Point" : "BHU",
    "Arr_Time" : 140,
    "Block_Mins" : 345
}
我必须使用此公式计算每个文档的分数
,并将其作为新字段插入文档:

我尝试过这个算法,使用
'async'
模块和
系列
方法,但没有得到理想的结果

var mongoose = require('mongoose'),
    express = require('express'),
    async = require('async'),
    Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');
var volSchema = new Schema({},{ strict: false, collection: 'vols' }),    
    Vol = mongoose.model("Vol", volSchema);

mongoose.set('debug', false);

mongoose.connection.on("open", function (err) {
    if (err) throw err;  
    var bulkUpdateOps = Vol.collection.initializeUnorderedBulkOp(), 
        counter = 0;

    Vol.find({}).lean().exec(function (err, docs) {
        if (err) throw err; 
        var locals = {};

        docs.forEach(function(doc) {            
            locals.c1 = 0.3728 + (0.00454 * doc.Seats);         
            locals.c3 = doc.Ops_Week;

            if (doc.Stops == 1) {               
                async.series([
                    // Load doc with first leg first
                    function(callback) {
                        Vol.findOne({ 
                            Mkt_Al: doc.Mkt_Al,
                            Orig: doc.Orig,
                            Dest: doc.Thru_Point                          
                        }).lean().exec(function (err, flight) {
                            if (err) return callback(err);
                            locals.first_leg = flight.Block_Mins;
                            callback();
                        });
                    },
                    // Load second leg doc 
                    // (won't be called before task 1's "task callback" 
                    // has been called)
                    function(callback) {                    
                        Vol.findOne({ 
                            Mkt_Al: doc.Mkt_Al,
                            Orig: doc.Thru_Point,
                            Dest: doc.Dest                          
                        }).lean().exec(function (err, flight) {
                            if (err) return callback(err);
                            locals.second_leg = flight.Block_Mins;
                            callback();
                        });
                    }
                ], function(err) { // This function gets called after the
                    // two tasks have called their "task callbacks"
                    if (err) throw err;
                    // Here locals will be populated with `first_leg` 
                    // and `second_leg`
                    // Just like in the previous example
                    var total_flight = locals.second_leg + locals.first_leg;                    
                    locals.c2 = 0.03;
                    locals.c4 = Math.pow((doc.Block_Mins / total_flight), -0.675);                    

                }); 
            } else {
                locals.c2 = 1;
                locals.c4 = 1;
            }

            counter++;
            console.log(locals);
            bulkUpdateOps.find({ "_id" : doc._id }).updateOne({ 
                "$set": { 
                    "Qsi": (locals.c1 * locals.c2 * locals.c3 * locals.c4) 
                } 
            });

            if (counter % 500 == 0) {
               bulkUpdateOps.execute(function(err, result) {          
                    if (err) throw err; 
                    bulkUpdateOps = Vol.collection.initializeUnorderedBulkOp();                        
                });
            } 
        });

        if (counter % 500 != 0) {
            bulkUpdateOps.execute(function(err, result) {
                if (err) throw err; 
                console.log(result.nModified);                
            });
        }   
    });
});
最后,我发现自己的结果在这两种情况下都是一样的,带停止飞行

我认为计算第二段的第二个任务将一直等到计算所有第一段,而不是在每个第一段之后

此外,分数的插入必须等到每个文档的分数计算结束,我认为
bulkinsert
应该在其他计算之后进行

现在我不知道是否应该使用async.seriesasync.foreachasync.parralel或将它们组合使用


请问谁能帮助实现上述目标…

请问谁能帮助?这里没有人帮助?请问谁能帮助?这里没有人帮助?