Как уже упоминалось здесь , поведение не является специфичным для PyMongo.
Причина в том, что метод count_documents
в PyMongo выполняет запрос агрегации и не использует метаданные. см. collection.py # L1670-L1688
pipeline = [{'$match': filter}]
if 'skip' in kwargs:
pipeline.append({'$skip': kwargs.pop('skip')})
if 'limit' in kwargs:
pipeline.append({'$limit': kwargs.pop('limit')})
pipeline.append({'$group': {'_id': None, 'n': {'$sum': 1}}})
cmd = SON([('aggregate', self.__name),
('pipeline', pipeline),
('cursor', {})])
if "hint" in kwargs and not isinstance(kwargs["hint"], string_type):
kwargs["hint"] = helpers._index_document(kwargs["hint"])
collation = validate_collation_or_none(kwargs.pop('collation', None))
cmd.update(kwargs)
with self._socket_for_reads(session) as (sock_info, slave_ok):
result = self._aggregate_one_result(
sock_info, slave_ok, cmd, collation, session)
if not result:
return 0
return result['n']
Эта команда имеет то же поведение , что и метод collection.countDocuments
.
При этом, если вы хотите обменять точность на производительность, вы можете использовать метод estimated_document_count
, который, с другой стороны, отправляет команду count
на база данных с тем же поведением , что и collection.estimatedDocumentCount
См. collection.py # L1609-L1614
if 'session' in kwargs:
raise ConfigurationError(
'estimated_document_count does not support sessions')
cmd = SON([('count', self.__name)])
cmd.update(kwargs)
return self._count(cmd)
Где self._count
- помощник , отправляющий команду.