Node.JS + mongo:.find().each() 在第一批后停止

2024-01-21

这让我难住了。

我有一个独立的(命令行执行的)节点脚本,其目的是迭代一个大集合(数十万个)中的所有文档,并对每个文档执行一些计算,运行一些额外的 JS 代码,然后用一些新值更新文档。

Per the 文档 https://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#each for cursor.each(),一旦我把光标从collection.find(), the .each(cb)方法应该执行cb(item)整个集合中的每个项目。

示例代码:

myDb.collection('bigcollection').find().each(function(err, doc) {
    if (err) {
        console.log("Error: " + err);
    } else {
        if (doc != null) {
            process.stdout.write(".");
        } else {
            process.stdout.write("X");
        }
    }
});

我期望这样做的是打印出几十万.的,然后打印一个X最后,如cursor.each()应该“迭代此游标的所有文档”,并且根据示例代码,“如果该项为空,则游标已耗尽/为空并关闭。”

但这又是什么actually确实打印出 101.的,没有X在最后。

如果我调整批量大小(.find().batchSize(10).each(...),在保释之前它会仔细检查该数量的文件。

那么,为什么它只处理第一批呢?我是否以某种方式误读了 .each() 的文档?这是否与以下事实有关:这是一个命令行脚本,并且整个脚本在第二批结果返回之前退出,或者其他什么?如果是这样,我如何确保它确实处理所有结果?

作为辅助节点,我尝试使用 .stream() 和 .forEach(),在这两种情况下,它都会在第一批之后放弃。

UPDATE:嗯,这很有趣。只是尝试连接到我的生产服务器而不是本地主机上的 mongo 实例,瞧,它像它应该的那样贯穿整个集合。服务器运行的是 mongodb 3.0.6,我的本地实例是 3.2.3。我的节点mongodb驱动程序版本是2.0.43。


我的收藏中有 200 个文档,下面的代码运行良好。换句话说,无法重现问题。如您所见,我已将批量大小减少到 10。

var url = 'mongodb://localhost:27017/test';
MongoClient.connect(url, function(err, db) {
    if (err) {
        console.log(err);
    }
    else {
        var counter = 0;
        db.collection('collection').find({}).batchSize(10).each(function(e, r){
            if(err){
                console.log("E: " +  err);
                db.close();
            }
            else{
                if(r ==  null){
                    db.close();
                }
                else{
                counter += 1;
                console.log("X: " +  counter);
                }
            }
        });
    }
});

如果您仍然遇到同样的问题,我建议将 MongoDB 驱动程序更新到最新版本。由于驱动程序正在积极开发中,有时错误会潜入已发布的版本中,从而导致奇怪的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.JS + mongo:.find().each() 在第一批后停止 的相关文章

随机推荐