{"id":154,"library":"pymongo","title":"PyMongo","description":"Official MongoDB Python driver. Synchronous client for MongoDB. v4.0 removed all APIs deprecated in v3.x — insert(), update(), remove(), count(), save() all gone. Current version: 4.16.0 (Mar 2026). Python 3.9+ required (3.8 dropped in v4.11). AsyncMongoClient added as GA in v4.13. Most LLM-generated pymongo code uses v3 patterns that break on v4.","status":"active","version":"4.16.0","language":"python","source_language":"en","source_url":"https://github.com/mongodb/mongo-python-driver","tags":["pymongo","mongodb","python","database","nosql"],"install":[{"cmd":"pip install pymongo","lang":"bash","label":"Python (sync)"},{"cmd":"pip install 'pymongo[srv]'","lang":"bash","label":"Python (with DNS SRV support for mongodb+srv://)"}],"dependencies":[{"reason":"Required for mongodb+srv:// connection strings. Install via pymongo[srv].","package":"dnspython","optional":true}],"imports":[{"note":"insert(), update(), remove(), save(), count() all removed in v4.0. Use insert_one/insert_many, update_one/update_many, delete_one/delete_many, count_documents instead.","wrong":"collection.insert({'name': 'Alice'})\ncollection.update({'name': 'Alice'}, {'$set': {'age': 31}})\ncollection.remove({'name': 'Alice'})\ncollection.count()","symbol":"MongoClient","correct":"from pymongo import MongoClient\n\nclient = MongoClient('mongodb+srv://user:pass@cluster.mongodb.net/')\ndb = client['mydb']\ncollection = db['users']\n\n# Insert\nresult = collection.insert_one({'name': 'Alice', 'age': 30})\nprint(result.inserted_id)\n\n# Find\ndoc = collection.find_one({'name': 'Alice'})\n\n# Update\ncollection.update_one({'name': 'Alice'}, {'$set': {'age': 31}})\n\n# Count\ncount = collection.count_documents({'age': {'$gt': 18}})\n\n# Delete\ncollection.delete_one({'name': 'Alice'})"},{"note":"AsyncMongoClient is now part of pymongo natively (GA in v4.13). Motor still works but native async is preferred for new projects.","wrong":"# Using motor for async — still valid but AsyncMongoClient is now native\nimport motor.motor_asyncio\nclient = motor.motor_asyncio.AsyncIOMotorClient('...')","symbol":"AsyncMongoClient (v4.13+ GA)","correct":"from pymongo import AsyncMongoClient\nimport asyncio\n\nasync def main():\n    client = AsyncMongoClient('mongodb+srv://user:pass@cluster.mongodb.net/')\n    db = client['mydb']\n    result = await db['users'].insert_one({'name': 'Alice'})\n    print(result.inserted_id)\n    await client.close()\n\nasyncio.run(main())"}],"quickstart":{"code":"# pip install 'pymongo[srv]'\nfrom pymongo import MongoClient\n\nclient = MongoClient('mongodb+srv://user:pass@cluster.mongodb.net/')\ndb = client['mydb']\ncol = db['users']\n\n# Insert\ncol.insert_one({'name': 'Alice', 'age': 30})\n\n# Find\nfor doc in col.find({'age': {'$gt': 18}}):\n    print(doc)\n\n# Update\ncol.update_one({'name': 'Alice'}, {'$set': {'age': 31}})\n\n# Count\nprint(col.count_documents({}))\n\n# Delete\ncol.delete_one({'name': 'Alice'})\n\nclient.close()","lang":"python","description":"Minimal pymongo 4.x CRUD operations."},"warnings":[{"fix":"insert_one({'key': 'value'}) or insert_many([{...}, {...}])","message":"collection.insert() removed in v4.0. Raises AttributeError. LLMs trained on pre-2022 data consistently generate insert() calls.","severity":"breaking","affected_versions":">= 4.0"},{"fix":"update_one(filter, update) or update_many(filter, update)","message":"collection.update() removed in v4.0. Raises AttributeError.","severity":"breaking","affected_versions":">= 4.0"},{"fix":"delete_one(filter) or delete_many(filter)","message":"collection.remove() removed in v4.0. Raises AttributeError.","severity":"breaking","affected_versions":">= 4.0"},{"fix":"count_documents(filter) — note: count_documents({}) counts all docs. estimated_document_count() for fast approximate count.","message":"collection.count() removed in v4.0. Raises AttributeError.","severity":"breaking","affected_versions":">= 4.0"},{"fix":"insert_one() for new docs, replace_one(filter, doc, upsert=True) for upsert.","message":"collection.save() removed in v4.0.","severity":"breaking","affected_versions":">= 4.0"},{"fix":"find_one_and_update(), find_one_and_replace(), or find_one_and_delete()","message":"collection.find_and_modify() removed in v4.0.","severity":"breaking","affected_versions":">= 4.0"},{"fix":"pip install 'pymongo[srv]'","message":"mongodb+srv:// connection strings require dnspython. 'pip install pymongo' alone raises ConfigurationError. Install with pip install 'pymongo[srv]'.","severity":"gotcha","affected_versions":"all"},{"fix":"Use Motor >= 3.6 with PyMongo >= 4.9. Or use native AsyncMongoClient (GA in 4.13) instead of Motor.","message":"Motor (async MongoDB) and PyMongo >= 4.9 version coupling. Motor < 3.6 is incompatible with PyMongo >= 4.9. Mixing versions causes ImportError or unexpected behavior.","severity":"gotcha","affected_versions":">= 4.9"},{"fix":"Use Python 3.9+","message":"Python 3.8 dropped in PyMongo 4.11. Python 3.9 is now minimum.","severity":"gotcha","affected_versions":">= 4.11"},{"fix":"from datetime import datetime, timezone; datetime.now(tz=timezone.utc)","message":"datetime.utcnow() pattern for MongoDB timestamps deprecated in Python 3.12. Use datetime.now(tz=timezone.utc) instead.","severity":"deprecated","affected_versions":"all"},{"fix":"Verify the `mongodb+srv` connection string hostname and ensure its corresponding SRV DNS record exists and is correctly configured with your DNS provider.","message":"Connecting with `mongodb+srv://` can fail with `ConfigurationError` if the SRV DNS record (e.g., `_mongodb._tcp.cluster.mongodb.net`) for the provided hostname does not exist (`NXDOMAIN`). This is an external DNS issue, not a missing dependency.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-12T09:05:00.359Z","next_check":"2026-06-24T00:00:00.000Z","problems":[{"fix":"Replace `collection.insert(document)` with `collection.insert_one(document)` for a single document, or `collection.insert_many(documents_list)` for multiple documents. Similarly, use `update_one()`/`update_many()` and `delete_one()`/`delete_many()` for update and delete operations.","cause":"The `insert()` method was removed in PyMongo 4.0.0, along with `update()`, `remove()`, and `save()`, in favor of more explicit single- or multi-document operations.","error":"AttributeError: 'Collection' object has no attribute 'insert'"},{"fix":"Use `collection.count_documents(filter_query)` for an accurate count, or `collection.estimated_document_count()` for a fast, approximate count of all documents in the collection (without a filter).","cause":"The `count()` method on both `Collection` and `Cursor` objects was deprecated in MongoDB 4.0 and removed in PyMongo 4.0. Attempting to use it on a Cursor in PyMongo 4.x will raise an AttributeError.","error":"AttributeError: 'Cursor' object has no attribute 'count'"},{"fix":"Upgrade your MongoDB server to a version compatible with your PyMongo driver (e.g., MongoDB 4.0+ for PyMongo 4.0+) or downgrade your PyMongo driver to a version compatible with your MongoDB server.","cause":"This error occurs when the PyMongo driver version is incompatible with the connected MongoDB server version, typically when using a newer PyMongo version with an older MongoDB server.","error":"pymongo.errors.ConfigurationError: Server at localhost:27017 reports wire version X, but this version of PyMongo requires at least Y (MongoDB Z.0)"},{"fix":"To get the number of inserted documents from `insert_many()`, use `len(result.inserted_ids)` instead.","cause":"The `InsertManyResult` object returned by `insert_many()` in PyMongo does not have an `inserted_count` attribute. This attribute was associated with older APIs or `BulkWriteResult`.","error":"AttributeError: 'InsertManyResult' object has no attribute 'inserted_count'"},{"fix":"Ensure that all asynchronous `motor` operations are prefixed with `await` to retrieve their resolved value. For example, change `doc = collection.find_one({})` to `doc = await collection.find_one({})`.","cause":"This error often occurs when using the `motor` (async PyMongo) driver and attempting to access the result of an asynchronous database operation (which returns a Future/coroutine) without `await`ing it first.","error":"TypeError: '_asyncio.Future' object is not subscriptable"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":null,"install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.29,"mem_mb":11.2,"disk_size":"25.7M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.29,"mem_mb":11.2,"disk_size":"25.7M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.21,"mem_mb":11.2,"disk_size":"28M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.21,"mem_mb":11.2,"disk_size":"28M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.45,"mem_mb":13.1,"disk_size":"29.0M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.45,"mem_mb":13.1,"disk_size":"29.0M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.37,"mem_mb":13.1,"disk_size":"32M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.36,"mem_mb":13.1,"disk_size":"32M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.63,"mem_mb":13.1,"disk_size":"20.7M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.61,"mem_mb":13.1,"disk_size":"20.7M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.57,"mem_mb":13.1,"disk_size":"24M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.57,"mem_mb":13.1,"disk_size":"24M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.59,"mem_mb":13.5,"disk_size":"20.3M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.61,"mem_mb":13.5,"disk_size":"20.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.56,"mem_mb":13.5,"disk_size":"25M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.55,"mem_mb":13.5,"disk_size":"25M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":11,"disk_size":"25.1M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.25,"mem_mb":11,"disk_size":"25.1M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"srv","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.22,"mem_mb":11,"disk_size":"26M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.23,"mem_mb":11,"disk_size":"26M"}]},"quickstart_checks":{"last_tested":"2026-04-23","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]}}