Как я могу перебирать всю коллекцию MongoDB с помощью mongojs?

Я использую mongojs, и я пытаюсь перебрать все элементы в коллекции

index = 0

db.keys.find({}, {uid: 1, _id: 0}).forEach((err, key) =>
    if err?
        console.log err
    else 
        console.log (++index) + " key: " + key_uid

который регистрирует

1 key: bB0KN
2 key: LOtOL
3 key: 51xJM
4 key: x9wFP
5 key: hcJKP
6 key: QZxnE
.
.
.
96 key: EeW6E
97 key: wqfmM
98 key: LIGHK
99 key: bjWTI
100 key: 2zNGE
101 key: F71mL

а затем останавливается. Однако, когда я вхожу в mongo из терминала и запускаю

> db.keys.count()
2317381

Так ясно, что он должен возвращать гораздо больше ключей. Есть ли у вас какие-либо идеи, что может вызвать такое поведение?

Ответ 1

Вам нужно использовать метод each(), а не forEach(). forEach() собирается перебирать каждый документ в пакете - поскольку вы обнаружили, что это значение по умолчанию равно 101. each() будет перебирать каждый документ в курсоре. Из документации:

каждый

Итерации по всем документам для этого курсора. Как и в случае {cursor.toArray}, не все элементы будут повторяться, если это курсор был ранее доступен. В этом случае {cursor.rewind} может для reset курсора. Однако, в отличие от {cursor.toArray}, курсор будет содержать только максимальные элементы размера партии при любом заданном если задан размер партии. В противном случае вызывающий отвечает для обеспечения того, чтобы весь результат мог соответствовать памяти.

http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html

Пример кода:

// Grab a cursor
      var cursor = collection.find();

      // Execute the each command, triggers for each document
      cursor.each(function(err, item) {

        // If the item is null then the cursor is exhausted/empty and closed
        if(item == null) {

          // Show that the cursor is closed
          cursor.toArray(function(err, items) {
            assert.ok(err != null);

            // Let close the db
            db.close();
          });
        };
      });

Ответ 2

Вы видите только первые 101 документ, потому что количество файлов MongoDB по умолчанию, полученных по умолчанию с сервера, в первом batch.

Для большинства запросов первая партия возвращает 101 документ или достаточно документы превышают 1 мегабайт. Последующий размер партии составляет 4 мегабайта.

Вы можете попробовать использовать find, а затем перебирать документы.

coll.find({}, {uid:1, _id : 0}, function(err, docs){
    if (err) {
        console.log(err);
        return;
    }
    docs.forEach(function(doc, index) { 
        console.log(index + " key: " + doc.uid) 
    });
});