Курсор драйвера Node.js MongoDB считает неправильно

У меня возникают проблемы с использованием встроенного драйвера MongoDB Node.js версии 2.2.29.

Это код, который я запускаю:

let cursor = db.collection( 'log' )
               .find({timestamp: { '$lte': 1498556839 }})
               .sort( { create_date_ttl: -1 } )
               .limit( 3 );

Если я сейчас запущу cursor.count() и обработаю обещание, я увижу, что счетчик дает мне 56 записей вместо 3 (указанный предел).

cursor.count().then( (count) => {
   // count here is 56
});

Однако, если я запускаю cursor.count( function (err, count) {}) с использованием обратных вызовов, правильно подсчитывается только 3 записи.

cursor.count( function (err, count) {
  // count here is 3 according to the limit specified.
});

У кого-нибудь такая же проблема или кто-нибудь может объяснить мне, как это возможно? Возможно, я что-то упускаю, но, согласно официальному документация.

Заранее спасибо.


person Moisés Belchín    schedule 27.06.2017    source источник
comment
Более интересным был бы результат простого запроса с обещанием, а не применение счетчика. Все документы потом возвращаются? Потому что это будет означать ошибку, когда модификаторы .sort() и .limit() не применяются в возвращаемом промисе.   -  person Neil Lunn    schedule 27.06.2017
comment
Ага. Прочтите документацию. mongodb.github.io/node-mongodb-native/ 2.2/api/Cursor.html#count. Подпись на самом деле говорит, что вам нужно установить первый аргумент в этом контексте.   -  person Neil Lunn    schedule 27.06.2017


Ответы (1)


Explicity устанавливает для первого аргумента ( applySkipLimit ) значение true, а затем будут применены skip и limit.

cursor.count(true).then( (count) => {
   // count here will be 3
});

Вроде в документации неясно, потому что там написано, что true должно быть значением по умолчанию. Как упоминалось в комментарии, это поведение обратного вызова.

person Jakub Kutrzeba    schedule 27.06.2017
comment
На самом деле документация точна и говорит вам сделать это. Первый вариант applySkipLimit Ссылка выше. Но да, это правильно. Я предполагаю, что разъяснение по умолчанию с обратным вызовом не соответствует тому, что говорится в документации. - person Neil Lunn; 27.06.2017
comment
Спасибо, Нил, за разъяснения, да, я думаю, что в документации было недостаточно ясно. - person Moisés Belchín; 28.06.2017