2015-09-19 2 views
14

В чем разница, я в основном хотел найти все документы в mycollection. db.mycollection.count() vs db.mycollection.find().count()?Разница между count() и find(). Count() в MongoDB

Оба они возвращают одинаковый результат. Есть ли причина, почему кто-то выбирает count() против find().count()? В отличие от того, что find() имеет установленный предел по умолчанию (исправьте меня, если я ошибаюсь), к которому вам нужно было бы ввести «это», чтобы увидеть больше в оболочке.

+5

Введите 'db.mycollection.count' без скобок в оболочку, и вы увидите вызовы методов там, где последняя строка будет' return this.find (query) .count(); 'которая в основном говорит, что если вы включили специальные модификаторы, такие как «skip» или «limit», тогда он в основном выполняет один и тот же оператор даже с запросом. Даже в командной форме не существует существенной разницы в базовом исполнении. –

+2

Оболочка усекает результаты для удобства. API MongoDB фактически ничего не урезает. Другими словами: 'find()' не имеет таких ограничений. –

ответ

21

db.collection.count() возвращает количество документов в коллекции и db.collection.find().count() возвращает число соответствия документов из find().

Это довольно ясно в документации:

db.collection.count(query)

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

cursor.count()

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

Кроме того, как упомянуто в documentation:

На sharded кластера, db.collection.count() может привести к неточному подсчета, если осиротевшие документы существуют или если миграция куска находится в стадии разработки.

Чтобы избежать этих ситуаций, на осколочном кластере используйте $ group stage метода db.collection.aggregate() для суммирования документов.

11

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

Это подтверждается явно в db.collection.count() documentation:

Для подсчета количества всех документов в коллекции заказов, используйте следующую операцию:

db.orders.count()

Эта операция эквивалентна следующие:

db.orders.find().count()

1

Как вы их используете, они оба возвращают одинаковые результаты, потому что вы не передаете критерии поиска в find().

2

Как упоминается в другом ответе sheilak, эти два эквивалента - за исключением того, что db.collection.count() может быть неточным для осколков кластеров.

The latest documentation говорит:

Количество() эквивалентно db.collection.find (запрос) .Count() конструкта.

И затем,

Sharded Кластеры

На sharded кластере, db.collection.count() может привести к неточному подсчета, если осиротевшие документы существуют, или если кусок происходит миграция .

В документации объясняется, как уменьшить этот bug (используйте агрегат).

Смежные вопросы