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

Dan*_*anM 6 javascript mongodb node.js node-mongodb-native

这让我很难过.

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

按照文档cursor.each(),一旦我有我的光标从collection.find(),该.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");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

我期望这样做是打印出几十万个.,然后X在最后打印一个,就像cursor.each()应该"迭代这个光标的所有文档",并根据示例代码,"如果项目是null然后光标耗尽/空并关闭."

实际上它的确是打印出精确的101 .,而不是X最后.

如果我调整批量大小(.find().batchSize(10).each(...),它会在捞出之前完成相应数量的文档.

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

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

更新: 嗯,这很有趣.刚尝试连接到我的生产服务器而不是我在localhost上的mongo实例,瞧,它会像它应该的那样遍历整个集合.服务器正在运行mongodb 3.0.6,我的本地实例是3.2.3.我的节点mongodb驱动程序版本是2.0.43.

Sal*_*eem 4

我的收藏中有 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);
                }
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

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