MongoDB count() по сравнению с countDocuments()

Я использую MongoDB и, в частности, Mongoose. Недавно я избавился от некоторых предупреждений об устаревании при обновлении mongo и mongoose.

Некоторые из моих запросов могут выглядеть следующим образом:

const count = await Badge.find(query).count().exec()

С тех пор я изменил это на

const count = Badge.find(query).countDocuments().exec()

и альт предупреждение об устаревании исчезло. Однако, читая документацию на MongoDB, кажется, что она должна быть написана так:

const count = Badge.countDocuments(query)

Все вышеперечисленное возвращает одно и то же. Очевидно, что последние два — это те, которые я хочу из-за устаревания count().

В чем разница между вторыми двумя и должен ли я предпочесть один другому?

Что документация драйвера говорит о правильном использовании?

D. SM 14.12.2020 22:38

@D.SM говорит, что db.collection.countDocuments() - это правильное использование, начиная с Mongo v4.0. Однако при тестировании я заметил, что db.collection.find().countDocuments() тоже работает. Но я не уверен, есть ли смысл использования более позднего, о котором я не думаю. Пытаюсь понять разницу.

SKeney 15.12.2020 03:35

Ссылка на документы, описывающие countdocuments. Если оба варианта использования задокументированы, любой из них является допустимым. Если задокументирован только один, другой не следует использовать, даже если он работает в настоящее время.

D. SM 15.12.2020 03:39
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
15
3
17 624
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Насколько я помню, метод count() использовался для оболочки mongo. и если вы хотите реализовать это на nodejs, вы должны использовать countDocuments() на основе драйвера nodejs.

также, согласно документации mongodb db.collection.count()

Возвращает количество документов, соответствующих запросу find() для коллекции или представления. Метод db.collection.count() не выполняет операцию find(), а вместо этого подсчитывает и возвращает количество результатов, соответствующих запросу.

Ссылка на db.collection.count()

db.collection.count() не подсчитывает фактическое количество документов, он возвращает результаты на основе метаданных коллекции, что может привести к приблизительному подсчету.

См. db.collection.count()

Для правильного различия MonogDB представила методы countDocuments() и estimatedDocumentCount().

Ответ принят как подходящий

Метод db.collection.find возвращает курсор. Метод cursor.count() для курсора подсчитывает количество документов, на которые ссылается курсор. Это то же самое, что и db.collection.count().

Оба эти метода (cursor.count() и db.collection.count()) устарели, начиная с MongoDB v4.0. Из документации:

Драйверы MongoDB, совместимые с функциями 4.0, устарели. соответствующие API-интерфейсы курсора и коллекции count() в пользу новых API-интерфейсов для countDocuments() и предполагаемыйDocumentCount(). Для конкретного API имена для данного драйвера, см. документацию по драйверу.

Избегайте использования метода db.collection.count() без предиката запроса. поскольку без предиката запроса метод возвращает результаты на основе метаданные коллекции, что может привести к приблизительному подсчету.

db.collection.countDocuments(query) возвращает количество документов, соответствующих запросу для коллекции или представления. Это метод, который вам нужно использовать для подсчета количества документов в вашей коллекции.

Все вышеперечисленное возвращает одно и то же.

Да, в большинстве случаев. Только countDocuments возвращает фактическое количество документов. Другие методы возвращают счетчики на основе метаданных коллекции.

Если вы хотите использовать db.collection.count, используйте его с предикатом запроса, и это вернет точное количество документов (но обратите внимание, что этот метод устарел).

Думаю, мой настоящий вопрос в том, можно ли использовать db.collection.find.countDocuments()? Он работает отлично, но в документации указано db.oollection.countDocuments() как использование.

SKeney 15.12.2020 03:33

У Mongoose есть собственный API о db.collection.find.countDocuments() (и он недоступен в оболочке mongo). Использование разное. См. Query.prototype.countDocuments() и Query от Mongoose.

prasad_ 15.12.2020 04:36

Другие вопросы по теме