2016-03-17 3 views
4

Я хотел бы понять, почему эти команды при запуске из экземпляра mongos против той же коллекции MongoDB возвращают разные числа?MongoDB db.collection.count() vs db.collection.find(). Length()

  • db.users.count()
  • db.users.find().length()

Что может быть причиной и это может быть признаком основных проблем?

ответ

1

Я считаю, что ваша коллекция оштукатурена.

Большинство решений с оштукатуренными базами данных имеют такое несоответствие из-за того, что некоторые команды рассматривают всю коллекцию, то есть все документы всех осколков, в то время как некоторые другие команды рассматривают только документы осколка, к которым он подключен.

Это то, что нужно всегда иметь в виду. Это в основном относится к командам, которые:

  • Количество
  • возвращают документ, имеющий наименьшее значение для данного поля
  • возвратного документ, имеющий наибольшее значение для данного поля
  • ...

Найдено на Монго docs:

count() эквивалентен конструкту db.collection.find (query) .count() . ... Sharded Кластеры

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

Таким образом, в случае Монго, это просто потому, что Монго всегда работает в фоновом процессе, некоторые перебалансированию документов внутри осколка, чтобы сохранить распределение Осколки совместимый с политикой шардинга определенных в коллекции.

Имейте в виду, что для обеспечения наилучшей производительности большинство оштукатуренных решений будут записывать документы на осколке, к которому подключен клиент, а затем позже поставить его там, где он действительно должен быть.

Именно поэтому nosql DBs часто помечены как в конечном итоге последовательным.

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