Skip to content
This repository was archived by the owner on Dec 1, 2025. It is now read-only.

Conversation

@jkassemi
Copy link

PyMongo ~=4.0 removes Cursor.count and Collection.count and provides two new count methods: Collection.count_documents and Collection.estimated_document_count. 1

image

When possible, we now try using the estimated document count for count operations, but if a limit or skip is defined, or a hint is provided, we'll use the more accurate count. This mirrors the behavior of the upstream mongoengine implementation.

Collection.count_documents issues an aggregate query, which is accurate in all cases, but relatively expensive. Collection.estimated_document_count in PyMongo >=4.0,<4.2 uses a $collStats aggregation to estimate the document count for the collection. In PyMongo >4.2 it relies on the count MongoDB command.

Footnotes

  1. https://pymongo.readthedocs.io/en/stable/migrate-to-pymongo4.html#collection-count-and-cursor-count-is-removed

PyMongo `~=4.0` removes `Cursor.count` and `Collection.count` and provides
two new count methods: `Collection.count_documents` and
`Collection.estimated_document_count`.

Both `Cursor.count` and `Collection.count` in PyMongo `~=3.0` use `count` MongoDB
command, which provide potentially inaccurate results when executd without a query
predicate, in a transaction, or on a sharded cluster.

`Collection.count_documents` issues an aggregate query, which is accurate in
all cases, but relatively expensive.

`Collection.estimated_document_count` in PyMongo `>=4.0,<4.2` uses a $collStats
aggregation to estimate the document count for the collection. In PyMongo `>4.2`
it relies on the `count` MongoDB command.

When possible, we now try using the estimated document count for count operations,
but if a limit or skip is defined, or a hint is provided, we'll use the more accurate
count.

This mirrors the behavior of the upstream mongoengine implementation.
@jkassemi jkassemi requested a review from wojcikstefan January 22, 2025 21:21
@jkassemi jkassemi merged commit a4cc37f into master Jan 23, 2025
3 checks passed
@jkassemi jkassemi deleted the jk-pymongo-deprecated-count branch January 23, 2025 20:58
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants