Как сказал @Remon, count () должен сканировать все документы, соответствующие запросу / фильтру.Это O (n), где n - это количество документов, которые будут соответствовать индексу, или количество документов в коллекции, если поле не проиндексировано.
В таких случаях вы обычно хотите вернуться ктребование.Тебе действительно нужно точное число для результата 10161684?Если точность важна, вы должны хранить отдельный счетчик для конкретного запроса.
Но в большинстве случаев точность не важна.Это одно из двух:
- Вам все равно, 10 миллионов или 10,2 миллиона, но важен порядок величины, т. Е. Вас волнует, 8 миллионов или 10 миллионов.
- Точное число вас волнует, только если оно маленькое.То есть вам интересно знать, что есть 44 результата или 72. Но как только он выходит за пределы, скажем, 1000, вы можете просто сказать «Более 1000 объектов», найденных пользователю.
В своих приложениях я обнаружил, что мне нужен второй вариант.Поэтому я также ограничиваю запрос count (), чтобы подсчет останавливался, когда он достигал предела.Вот так:
db.datasources.find({nid: 19882}).limit(1000).count(true)
Для пользователя я отображаю «1000 или более найденные результаты», если счет равен 1000, в противном случае я отображаю точное число.
Что касается первого варианта ... Я еще не придумал опрятного решения.