Разница между count() и find(). Count() в MongoDB
В чем разница, я в основном хотел найти все документы в mycollection. db.mycollection.count()
vs db.mycollection.find().count()
?
Они оба возвращают тот же результат. Есть ли причина, почему кто-то выбирает count()
против find().count()
? В отличие от того, что find()
имеет установленный по умолчанию предел (исправьте меня, если я ошибаюсь), к которому вам придется набирать "это", чтобы увидеть больше в оболочке.
Ответы
Ответ 1
db.collection.count()
и cursor.count()
- это просто обертки вокруг команды count command
результате которой выполняется db.collection.count()
и cursor.count()
с/без того же самого, что и тот же аргумент запроса, вернется тот же результат. Однако результат count
может быть неточным в разбитом кластере.
Ответ 2
db.collection.count()
без параметров подсчитывает все документы в коллекции. db.collection.find()
без параметров соответствует всем документам в коллекции, а count()
подсчитывает их, поэтому нет никакой разницы.
Это явно подтверждается в документации db.collection.count():
Чтобы подсчитать количество всех документов в коллекции заказов, используйте следующую операцию:
db.orders.count()
Эта операция эквивалентна следующему:
db.orders.find().count()
Ответ 3
Как упоминается в другом ответе sheilak, они эквивалентны, за исключением того, что db.collection.count()
может быть неточным для осколков кластеров.
В последней документации говорится:
count() эквивалентен конструкту db.collection.find(query).count().
А потом,
Осколочные кластеры
В закрытом кластере db.collection.count() может привести к неточному счету, если существуют сиротские документы или выполняется миграция кусков.
В документации объясняется, как уменьшить эту ошибку (использовать агрегат).
Ответ 4
Как вы их используете, они возвращают одинаковые результаты, потому что вы не передаете критерии поиска в find().
Ответ 5
Я считаю, что если вы используете какую-то разбивку на страницы, например:
find(query).limit().skip().count()
Вы не получите тот же результат, что и
count(query)
Поэтому в таких случаях, если вы хотите получить общее количество, я думаю, вам, возможно, придется использовать оба.
Ответ 6
db.collection.count() эквивалентен конструкту db.collection.find(query).count().
Примеры
Подсчитайте все документы в коллекции
db.orders.count()
Эта операция эквивалентна следующему:
db.orders.find().count()
Подсчитайте все документы, соответствующие запросу
Подсчитайте количество документов в коллекции заказов с полем ord_dt больше новой даты ('01/01/2012 '):
db.orders.count( { ord_dt: { $gt: new Date('01/01/2012') } } )
Запрос эквивалентен следующему:
db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') } } ).count()
Согласно документации в следующем сценарии db.collection.count() может быть неточным:
- В кластерном кластере db.collection.count() без предиката запроса может привести к неточному счету, если существуют сиротские документы или выполняется миграция кусков.
- После нечистого отключения mongod с помощью механизма хранения Wired Tiger статистика подсчета, подсчитанная count(), может быть неточной.