问题
I need to compare two collections of objects from mongo db. My shell script looks like this:
//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]));
})
I execute this script in the Robomongo. But i have a problem. At the result only 8 items from 367 was printed. Robomongo didn't show any error messages. When i used
print(item);
inside foreach, all worked fine and all 367 objects was printed. Also i tried to use Deep Diff library for objects comparison but got same result - only 12 items from 367 was printed.
I think the problem in the memory consumption, but i don't know how to handle it, and why Robomongo doesn't print any errors.
I tried to iterate only cursors but it didn't help.
Why foreach could iterate not all items and how to fix it ?
[UPDATE 1] After some time of the investigation i mentioned that if i run script in just opened tab in Robomongo it prints 102 elements, but when i run it again in the same tab it prints only 12.
[UPDATE 2] I tried to run script using native mongo shell mongo.exe and got 100 from 367 elements printed, without errors
回答1:
[Updated]
It might be related to the timeout. Robomongo has 15 seconds default timeout which is in the config file and it can be changed. This might help:
[Update-1]
Starting from version Robo 3T - 1.1 (formerly Robomongo), the shell timeout is configurable on UI and also there is a fix to prevent this issue happening. See
http://blog.robomongo.org/robomongo-is-robo-3t/#4a. So no need to change config file as explained below for older versions.
Workaround solution for earlier versions than 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\0.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.
Reference: https://github.com/paralect/robomongo/issues/1106#issuecomment-230258348
来源:https://stackoverflow.com/questions/39838221/foreach-doesnt-iterate-all-collection-in-mongodb