MongoDB Node JS 驱动程序,如何知道.updates 何时完成

MongoDB NodeJS driver, how to know when .update() 's are complete

由于代码太大,无法张贴在这里,我附加了我的 github 存储库 https://github.com/DiegoGallegos4/Mongo

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

文件: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)
    }
})

这是用于解决问题的结构,涉及何时关闭连接,即当数据数组的长度等于更新操作的回调数时。有关更多详细信息,您可以参考回购协议。

文件:weather.js

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

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

我读过有关连接池的内容,但我想知道我的代码中存在什么概念性错误。如果能深入了解这个主题,我将不胜感激。

你提出问题的方式非常具有误导性。你只想知道"When is the processing complete so I can close?".

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

没有其他依赖的简单方法是使用驱动程序支持的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" 出现的地方,最重要的是它们被调用的地方。

简而言之,"data" 事件是由游标结果中的每个文档发出的。首先你调用 .pause() 这样新文档就不会超出处理范围。然后您执行 .update() 并在 return 的回调中调用 .resume(),流程继续下一个文档。

最终 "end" 在光标耗尽时发出,这就是您调用 db.close().

的地方

这就是基本的流量控制。其他的方法,看看node async库这个好帮手。但是不要在没有异步控制的情况下循环数组,也不要使用 DEPRECATED.

.each()

您需要在 .update() 回调完成时发出信号,以便无论如何跟随新的 "loop iteration"。这是基本的无附加依赖方法。

P.S 我对您的代码的一般逻辑有点怀疑,尤其是测试当您阅读某些内容的长度而不可能更改该长度时,它是否更长。但这都是关于如何实现 "flow control",而不是修复代码中的逻辑。