forEach 不会迭代 mongodb 中的所有集合
forEach doesn't iterate all collection in mongodb
我需要比较来自 mongo 数据库的两个对象集合。
我的 shell 脚本如下所示:
//Both arrays have 367 pretty big objects.
var list1 = db.collection1.find({..condition..}).toArray();
var list2 = db.collection2.find({..condition..}).toArray();
function compare(left, right){
var l = left.data.NP;
var r = right.data.NP;
if(JSON.stringify(l) === JSON.stringify(r)){
return 'Equal';
} else {
return 'Not equal';
}
}
list1.forEach(function(item, index){
print(index, compare(item,list2[index]));
})
我在 Robomongo 中执行这个脚本。
但我有一个问题。结果 367 个项目中只打印了 8 个项目。 Robomongo 没有显示任何错误信息。
当我使用
print(item);
在 foreach 内部,一切正常,打印了所有 367 个对象。我还尝试使用 Deep Diff 库进行对象比较,但得到了相同的结果——仅打印了 367 中的 12 项。
我认为是内存消耗的问题,但我不知道如何处理,以及为什么 Robomongo 不打印任何错误。
我试图只迭代游标,但没有帮助。
为什么 foreach 不能迭代所有项目以及如何解决它?
[更新 1]
经过一段时间的调查后,我提到如果我 运行 在 Robomongo 中刚刚打开的选项卡中编写脚本,它会打印 102 个元素,但是当我在同一个选项卡中再次 运行 它时,它只会打印12.
[更新 2]
我尝试使用本机 mongo shell mongo.exe 运行 脚本并从打印的 367 个元素中得到 100 个,没有错误
[已更新]
可能与超时有关。 Robomongo 在配置文件中有 15 秒的默认超时,可以更改。这可能有帮助:
[更新-1]
从版本 Robo 3T - 1.1(以前称为 Robomongo)开始,shell 超时可在 UI 上配置,并且还有一个修复程序可以防止此问题发生。看
http://blog.robomongo.org/robomongo-is-robo-3t/#4a。所以不需要像下面解释的那样为旧版本更改配置文件。
1.1 之前版本的解决方案:
Make sure Robomongo is closed. Open robomongo.json configuration file.
[Update]: Adding link to Robomongo-Config-File-Guide for newer versions.
Windows
0.9.x
C:\Users\<user>\.config\robomongo[=10=].9\robomongo.json
0.8.x
C:\Users\<user>\.config\robomongo\robomongo.json
MAC
0.9.x
/Users/<user>/.config/robomongo/0.9/robomongo.json
0.8.x
/Users/<user>/.config/robomongo/robomongo.json
Linux
0.9.x
/home/<user>/.config/robomongo/0.9/robomongo.json
0.8.x
/home/<user>/.config/robomongo/robomongo.json
- Change "shellTimeoutSec" attribute value to higher number in seconds. (i.e. "shellTimeoutSec" : 60)
- Save config file and re-launch Robomongo app.
- Run necessary script. If script isn't executed entirely, try to increase shellTimeoutSec value.
参考:
https://github.com/paralect/robomongo/issues/1106#issuecomment-230258348
我需要比较来自 mongo 数据库的两个对象集合。 我的 shell 脚本如下所示:
//Both arrays have 367 pretty big objects.
var list1 = db.collection1.find({..condition..}).toArray();
var list2 = db.collection2.find({..condition..}).toArray();
function compare(left, right){
var l = left.data.NP;
var r = right.data.NP;
if(JSON.stringify(l) === JSON.stringify(r)){
return 'Equal';
} else {
return 'Not equal';
}
}
list1.forEach(function(item, index){
print(index, compare(item,list2[index]));
})
我在 Robomongo 中执行这个脚本。 但我有一个问题。结果 367 个项目中只打印了 8 个项目。 Robomongo 没有显示任何错误信息。 当我使用
print(item);
在 foreach 内部,一切正常,打印了所有 367 个对象。我还尝试使用 Deep Diff 库进行对象比较,但得到了相同的结果——仅打印了 367 中的 12 项。
我认为是内存消耗的问题,但我不知道如何处理,以及为什么 Robomongo 不打印任何错误。
我试图只迭代游标,但没有帮助。
为什么 foreach 不能迭代所有项目以及如何解决它?
[更新 1] 经过一段时间的调查后,我提到如果我 运行 在 Robomongo 中刚刚打开的选项卡中编写脚本,它会打印 102 个元素,但是当我在同一个选项卡中再次 运行 它时,它只会打印12.
[更新 2] 我尝试使用本机 mongo shell mongo.exe 运行 脚本并从打印的 367 个元素中得到 100 个,没有错误
[已更新]
可能与超时有关。 Robomongo 在配置文件中有 15 秒的默认超时,可以更改。这可能有帮助:
[更新-1]
从版本 Robo 3T - 1.1(以前称为 Robomongo)开始,shell 超时可在 UI 上配置,并且还有一个修复程序可以防止此问题发生。看
http://blog.robomongo.org/robomongo-is-robo-3t/#4a。所以不需要像下面解释的那样为旧版本更改配置文件。
1.1 之前版本的解决方案:
Make sure Robomongo is closed. Open robomongo.json configuration file.
[Update]: Adding link to Robomongo-Config-File-Guide for newer versions.
Windows 0.9.x C:\Users\<user>\.config\robomongo[=10=].9\robomongo.json 0.8.x C:\Users\<user>\.config\robomongo\robomongo.json MAC 0.9.x /Users/<user>/.config/robomongo/0.9/robomongo.json 0.8.x /Users/<user>/.config/robomongo/robomongo.json Linux 0.9.x /home/<user>/.config/robomongo/0.9/robomongo.json 0.8.x /home/<user>/.config/robomongo/robomongo.json
- Change "shellTimeoutSec" attribute value to higher number in seconds. (i.e. "shellTimeoutSec" : 60)
- Save config file and re-launch Robomongo app.
- Run necessary script. If script isn't executed entirely, try to increase shellTimeoutSec value.
参考: https://github.com/paralect/robomongo/issues/1106#issuecomment-230258348