forEach не перебирает всю коллекцию в mongodb

Мне нужно сравнить две коллекции объектов из mongo db. Мой сценарий оболочки выглядит так:

//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. Но у меня есть проблема. В результате было напечатано только 8 экземпляров из 367. Robomongo не показывал никаких сообщений об ошибках. когда я использовал

print(item);

внутри foreach все работало нормально, и все 367 объектов были напечатаны. Также я пытался использовать библиотеку Deep Diff для сравнения объектов, но получил тот же результат - было напечатано только 12 элементов из 367.

Я думаю проблема в потреблении памяти, но я не знаю как с этим справиться, и почему Robomongo не выводит никаких ошибок.

Я пытался перебирать только курсоры, но это не помогло.

Почему foreach может перебирать не все элементы и как это исправить?

[ОБНОВЛЕНИЕ 1] После некоторого времени расследования я упомянул, что если я запускаю скрипт на только что открытой вкладке в Robomongo, он печатает 102 элемента, но когда я снова запускаю его на той же вкладке, он печатает только 12.

[ОБНОВЛЕНИЕ 2] Я попытался запустить скрипт, используя собственную оболочку mongo mongo.exe, и получил 100 из 367 напечатанных элементов без ошибок.


person Eugene    schedule 03.10.2016    source источник


Ответы (1)


[Обновлено]

Это может быть связано с тайм-аутом. У Robomongo есть тайм-аут по умолчанию 15 секунд, который находится в файле конфигурации, и его можно изменить. Это может помочь:

[Обновление-1]
Начиная с версии Robo 3T - 1.1 (ранее Robomongo) время ожидания оболочки настраивается в пользовательском интерфейсе, а также имеется исправление для предотвращения возникновения этой проблемы. См. http://blog.robomongo.org/robomongo-is-robo-3t/#4a. Поэтому нет необходимости изменять файл конфигурации, как описано ниже для более старых версий.

Временное решение для более ранних версий, чем 1.1:

Убедитесь, что Robomongo закрыт. Откройте файл конфигурации robomongo.json.

[Обновление]: Добавление ссылки на Robomongo-Config-File-Guide для более новых версий.

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
  1. Измените значение атрибута «shellTimeoutSec» на большее число в секундах. (т.е. "shellTimeoutSec": 60)
  2. Сохраните файл конфигурации и перезапустите приложение Robomongo.
  3. Запустите необходимый скрипт. Если скрипт не выполняется полностью, попробуйте увеличить значение shellTimeoutSec.

Ссылка: https://github.com/paralect/robomongo/issues/1106#issuecomment-230258348

person Gokhan Simsek    schedule 07.10.2016