Zapytania zliczające, indeksowane lub nie, są powolne, ponieważ MongoDB nadal musi wykonać pełny spacer po b-drzewie, aby znaleźć odpowiednią liczbę dokumentów spełniających twoje kryteria. Powodem tego jest to, że struktura b-drzewa MongoDB nie jest "zliczana", co oznacza, że każdy węzeł nie przechowuje informacji o ilości elementów w węźle/poddrzewie.
Problem jest zgłaszany tutaj https://jira.mongodb.org/browse/SERVER-1752 i obecnie nie ma obejścia, które poprawiłoby wydajność, poza ręcznym utrzymaniem licznika dla tej kolekcji, co oczywiście ma kilka wad.
Należy również zauważyć, że wersja db.col.count() (a więc bez kryteriów) może mieć duży skrót i w rzeczywistości nie wykonuje zapytania, dlatego jest to szybkość. To powiedziawszy, nie zawsze zgłasza tę samą wartość, co zapytanie licznikowe, które powinno zwrócić wszystkie elementy (na przykład nie będzie w środowiskach podzielonych na fragmenty o wysokiej przepustowości zapisu). Do dyskusji, czy to błąd. Myślę, że tak.
Zauważ, że w wersji 2.3+ wprowadzono znaczącą optymalizację, która powinna (i poprawia) wydajność liczenia na indeksowanych polach. Zobacz:https://jira.mongodb.org/browse/SERVER-7745