gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:28:29 26 4
gpt4 key购买 nike

这让我很难过。

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

根据 documentation对于 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");
}
}
});

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

但它实际上所做的只是打印出精确的 101 个 .,最后没有 X

如果我调整批量大小 (.find().batchSize(10).each(...),它会在保释前准确地检查该数量的文档。

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

作为一个侧 Node ,我尝试过使用 .stream() 和 .forEach(),在这两种情况下,它在第一批之后就放弃了。

更新:嗯,这很有趣。刚刚尝试连接到我的生产服务器而不是本地主机上的 mongo 实例,瞧,它像应有的那样贯穿整个集合。服务器运行的是mongodb 3.0.6,我的本地实例是3.2.3。我的node 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 驱动程序更新到最新版本。由于驱动程序正在积极开发中,有时错误会潜入已发布的版本中,从而导致奇怪的行为。

关于javascript - Node.JS + mongo : . find().each() 在第一批后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36407641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com