Разница между 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() может быть неточным:

  1. В кластерном кластере db.collection.count() без предиката запроса может привести к неточному счету, если существуют сиротские документы или выполняется миграция кусков.
  2. После нечистого отключения mongod с помощью механизма хранения Wired Tiger статистика подсчета, подсчитанная count(), может быть неточной.