MongoDB NodeJS驱动程序,如何知道.update()的完成时间

时间:2015-09-03 06:47:36

标签: node.js mongodb mongodb-query node-mongodb-native

由于此处的代码非常大,我附加了我的github repo https://github.com/DiegoGallegos4/Mongo

我正在尝试使用de NodeJS驱动程序来更新符合条件的某些记录,但首先我必须找到满足其他条件的一些记录。在更新部分,使用从查找操作中找到和过滤的记录。这是,

file:weather1.js

MongoClient.connect(some url, function(err,db){
    db.collection(collection_name).find({},{},sort criteria).toArray(){
          .... find the data and append to an array
          .... this data inside a for loop
          db.collection(collection_name).update(data[i], {$set...}, callback)
    }
})

用于解决问题的结构,关于何时关闭连接,当数据数组的长度等于更新操作的回调数时。有关详细信息,请参阅回购。

file:weather.js

在另一种方法中,使用 .each 代替 .Aarray 来迭代光标。

我已经在几个论坛上找了一个星期的解决方案。

我已经阅读了有关池连接但我想知道我的代码上的概念错误是什么。我非常感谢对此主题的深刻见解。

1 个答案:

答案 0 :(得分:1)

你提出问题的方式非常误导。所有你想知道的是"处理完成的时间是什么,所以我可以关闭?"

答案就是你需要尊重回调,一般只在每次更新完成后才通过结果光标移动。

没有其他依赖关系的简单方法是使用驱动程序支持的stream interface

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/data',function(err,db){

    if(err) throw err;

    coll = db.collection('weather');
    console.log('connection established')

    var stream = coll.find().sort([['State',1],['Temperature',-1]])

    stream.on('err',function(err) {
        throw err;
    });

    stream.on('end',function() {
        db.close();
    });

    var month_highs = [];
    var state = '';
    var length = 0;


    stream.on('data',function(doc) { 
        stream.pause();                           // pause processing documents

        if (err) throw err;

        if (doc) {
            length = month_highs.length
            if(state != doc['State']){
                month_highs.push(doc['State']);
                //console.log(doc);
            }
            state = doc['State']

            if(month_highs.length > length){
                coll.update(doc, {$set : {'month_high':true} }, function(err, updated){
                    if (err) throw err;
                    console.log(updated)
                    stream.resume();              // resume processing documents
                });
            } else {
                stream.resume();
            }
        } else {
            stream.resume();
        }
    });

});

这只是您的回购代码的副本,重构为使用流。因此,所有重要的部分都是“" stream"出现,最重要的是它们被称为。

简而言之,"数据"每个文档从游标结果发出事件。首先,您调用.pause(),以便新文档不会超出处理范围。然后,当您致电.update()时,执行.resume()并在其内部回调,然后流程继续下一个文档。

最终"结束"在光标耗尽时发出,这就是你调用db.close()的地方。

这是基本的流量控制。对于其他方法,请将node async库视为好帮手。但是不要循环没有异步控制的数组,也不要使用 DEPRECATED .each()

您需要在.update()回调完成时发出信号,以跟随新的"循环迭代"好歹。这是基本的无附加依赖方法。

P.S我对你的代码的一般逻辑有点怀疑,尤其是当你在不改变那个长度的情况下读取它时,如果某个东西的长度更大的话。但这都是关于如何实现流量控制"而不是修复代码中的逻辑。