Client-side query caching for PyMongo
client-query-cache uses MongoDB change streams to asynchronously invalidate cached query results. It supports synchronous and asyncio applications without requiring a separate cache server.
%%{init: {"flowchart": {"diagramPadding": 75}}}%%
flowchart LR
App["Python<br/>application"] -->|"Reads"| Cache["Client-side<br/>caching"]
Cache -->|"Miss / bypass"| DB[("MongoDB")]
DB -.->|"Change streams<br/>Async invalidation"| Cache
Cache hits are served from client-side memory, reducing read latency and database load in read-heavy applications.
The library is tested against real MongoDB replica sets, including concurrency stress tests, and automated checks guard its performance and memory use against regressions.
Results vary by workload and deployment. Measurements and methodology.
Caching requires MongoDB 8.0+ on a replica set or sharded cluster. Reads on standalone servers and older MongoDB versions run through PyMongo without caching.
Invalidation is asynchronous: a cached read can return a preceding value until the write's change-stream event is processed. Use PyMongo directly when a read must immediately observe a preceding write; see consistency.
Eligible cache misses read from the primary with majority read concern, even when the collection leaves read concern unspecified, so only majority-committed results enter the cache. Uncached PyMongo reads use the deployment's default read concern, normally local. The two usually perform alike, but while replication lags or data-bearing members are unavailable, a miss can return older data or fail where an uncached read would not. Majority admission does not make cache hits current: invalidation remains asynchronous. See bypass conditions.
Quick start
uv add client-query-cache
Or use pip install client-query-cache.
from pymongo import MongoClient
from client_query_cache import CacheManager
with (
MongoClient("mongodb://localhost:27017") as client,
CacheManager(client) as cache_manager,
):
collection = client["client_query_cache_tutorial"]["items"]
cached_collection = cache_manager.get_cached_collection(collection)
collection.replace_one(
{"_id": "example"}, {"_id": "example", "value": 42}, upsert=True
)
cached_collection.find_one({"_id": "example"}) # Reads from MongoDB.
cached_collection.find_one({"_id": "example"}) # Repeated reads can use the cache.
References
Getting started · Benchmarks · Examples
MongoDB is a registered trademark of MongoDB, Inc. This project is independent and is not affiliated with or endorsed by MongoDB, Inc.
Metadata
Release files for client-query-cache 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| client_query_cache-0.7.0.tar.gz | 46.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| client_query_cache-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 113.1 kB
Release files / client_query_cache-0.7.0.tar.gz
| Download URL | client_query_cache-0.7.0.tar.gz |
|---|---|
| Size | 46.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0be459f70574af4d783c8386c46cd133374a21de2a15f481fa4c4430923e2d98
|
|
BLAKE2b-256 checksum How to use checksums |
c890589e74bd4cca336525af8bf3675f53fa4253a06c0bbaa73dfe8ab09f620c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logRelease files / client_query_cache-0.7.0-py3-none-any.whl
| Download URL | client_query_cache-0.7.0-py3-none-any.whl |
|---|---|
| Size | 66.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6c019331d501d5088fbabe002be9ff3dbcef9a29e5479d357b7128233a9675a2
|
|
BLAKE2b-256 checksum How to use checksums |
ac0a34720b29da7d4668f98f3b8ccc04aba642125ecfdd50b4422f49f89a9870
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency log