Я использую 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 говорит, что db.collection.countDocuments()
- это правильное использование, начиная с Mongo v4.0. Однако при тестировании я заметил, что db.collection.find().countDocuments()
тоже работает. Но я не уверен, есть ли смысл использования более позднего, о котором я не думаю. Пытаюсь понять разницу.
Ссылка на документы, описывающие countdocuments. Если оба варианта использования задокументированы, любой из них является допустимым. Если задокументирован только один, другой не следует использовать, даже если он работает в настоящее время.
Насколько я помню, метод count() использовался для оболочки mongo. и если вы хотите реализовать это на nodejs, вы должны использовать countDocuments() на основе драйвера nodejs.
также, согласно документации mongodb db.collection.count()
Возвращает количество документов, соответствующих запросу find() для коллекции или представления. Метод db.collection.count() не выполняет операцию find(), а вместо этого подсчитывает и возвращает количество результатов, соответствующих запросу.
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()
как использование.
У Mongoose есть собственный API о db.collection.find.countDocuments()
(и он недоступен в оболочке mongo). Использование разное. См. Query.prototype.countDocuments() и Query от Mongoose.
Что документация драйвера говорит о правильном использовании?