How To Delete MongoDB Documents Using Python
Introduction
Delete MongoDB documents PyMongo is an important part of your regular maintenance routine for your MongoDB collections. As you add, modify, and analyze stored data, it becomes even more essential to clean out the clutter and remove MongoDB documents Python. The more organized your collections are, the easier it may become for you to make room for more relevant documents based on your needs.
If you’re just starting out and learning about how to delete MongoDB documents Python, this tutorial will explain the basics. Advanced users, if you already know how it’s done and want to skip the details of this lesson, you can go straight to Just the Code.
Prerequisites
- MongoDB – Download MongoDB and install it. Check the version with the
mongo --versioncommand like this below:
1 | mongo --version |
- PyMongo Driver – Download the Python driver. Use the
pip3package manager to install PyMongo, the Python 3 MongoDB driver like this below:
1 | pip3 install pymongo |
- It’s a good idea to install BSON library for MongoDB. Using the
ObjectIDclass from the library might come in handy when you want to delete a document by it’s_id.
1 | pip3 install bson |
- Create a sample MongoDB collection with a few unimportant test documents you can delete documents PyMongo as you practice with this tutorial.
Get your sample MongoDB collection ready for querying documents
Import
MongoClientfrom PyMongoMake a
MongoClientinstanceFrom the
MongoClientinstance you just made, construct objects of a database and at least one collection. You’ll use those for this lesson because you’ll need to delete documents after you make the appropriate API calls.
1 2 3 4 5 | # From the PyMongo library, do importation of the MongoClient class from pymongo import MongoClient # Make a MongoClient fresh instance mongo_client = MongoClient('mongodb://localhost:27017') |
- Get the database and a collection from it from the instance of the MongoDB client.
1 2 3 | # get access to a MongoDB database and one of its collections db = mongo_client.some_database col = db.some_collection |
NOTE: You won’t see a collection of documents if some_collection isn’t there. It will slowly be created after you add documents though, however, you won’t get a warning or see an exception raised by PyMongo. For that reason, make sure your collection does exist.
Locate some MongoDB documents for deletion
- Verify that you made a PyMongo instance of a collection and that it contains documents. To do this, find a list of databases in MongoDB with the method
list_database_names().
1 | database_list = mongo_client.list_database_names() |
Make an API call with the method database_names()
- To the
database_names()method, pass a database name’s string that you’ve chosen from the list. You should see a collection list of MongoDB documents for that database.
1 | col_list = db.list_collection_names() |
- Next, use the method
count_documents()to pass a dictionary object ({}). It must be empty. The collection’s documents will be represented by an integer.
1 2 3 4 5 | # make a collection object col = db["Some Collection"] # get the number of documents in the collection print ( "TOTAL DOCS:", col.count_documents({}) ) |
- Another way to determine the number of documents of a collection is to use its
find()method. The Cursor object will contain the documents. To get the results quickly, use the functionenumerate()function, or the functionfor.
1 2 3 4 5 6 | # get a list of a collection's documents col_docs = col.find() # iterate the list of document's returned by find() for doc in col_docs: print (doc) |
NOTE: Keep in mind, the old count() Cursor object method is out of date. If you try it now, you’ll raise an exception. To get the complete number of documents, remember to use the Collection.count_documents() method instead.
- All documents content and IDs are listed in the Cursor object. Make API calls with a Python dictionary object. State your query using a document’s ID or content. Then you can delete that document.
Make a delete-query filter for a Python dictionary
- Query the Python dictionary and pass it to either method
delete_many()ordelete_one()based on how many documents as well as which ones you want to delete.
1 2 | # document(s) matching this query will get deleted some_query = {"target field" : "target value"} |
Be sure to check the target
field. It is the dictionary key for the document.Verify that the target
valuematches the document’s value as well.
Use the find_one_and_delete() method to return deleted documents’ JSON contents
- Pass a query to the
find_one_and_delete()method to return deleted documents.
NOTE: To return results, it’s necessary to pass the ({}) dictionary object, empty ones too.
1 | result = collection_object.find_one_and_delete( {} ) |
- You can tell the deleted document when you call the result object’s
"_id"key attribute orvalue()method.
1 2 3 4 5 6 | # print the dict values returned by method call print ("find_one_and_delete:", result.value()) # print the _id key ONLY if the result is not None if ("_id" in result): print ("find_one_and_delete ID:", result["_id"]) |
- A
NoneTypeobject will be returned in matchless or empty collections.
The correct MongoDB API calls to use to delete documents in a collection
- Only use
find_one_and_delete(),delete_many(), ordelete_one(); otherwise, you’ll get warning message.
The Remove() method is out of date, so use delete_one() or delete_many() to delete documents
Make an API call using the delete_one() method to delete a single document
- Although you can have many matches, sometimes you might want to just delete one document. In that case, use the method
delete_one().
1 2 3 4 5 | result = some_collection.delete_one(some_query) # print the API call's results print("API call recieved:", result.acknowledged) print("Documents deleted:", result.deleted_count) |
You’ll see the deleted documents–one or more–when the
pymongo.results.DeleteResultis returned.A
1value next to theresult.deleted_countmeans that one document matched the query; a0value indicates no matches. if any documents
The way to remove an unspecified MongoDB document
Remove a document where the JSON document body isn’t a criterion for removing the document.
- Use the method call
delete_one()and pass the Python empty ({}) dictionary to it.
1 2 3 4 5 | result = collection_object.delete_one({}) # print the API call's results print("API call recieved:", result.acknowledged) print("Documents deleted:", result.deleted_count) |
- If the results return at a minimum one document, you should see a
1represented for theresult.deleted_count.
Find the ObjectID of a document to delete it
- The 12-byte, encoded
bson.objectid.ObjectIdBSON object comes with every document. It’s a timestamp index ID that is unique to each file.
Use MongoDB query methods to query the "_id" of a document you want to delete
- The API query methods in MongoDB let you pass BSON objects. Take method
delete_one(), for example. When queried using that method, you can delete a document that matches the query_id.
How to bypass a PyMongo NameError: <span>name 'ObjectId' is not defined exception
- The
ObjectIdclass for the BSON library is what you’ll need to import to avoid raising any type ofNameErrorexception. Go ahead and import the BSON library’s classObjectIdnow.
1 | from bson import ObjectId |
NOTE: Install the BSON library with the pip3 package manager if you get an ImportError.
Query the ObjectId value of the _id field when calling the method delete_one() to complete a MongoDB document deletion
Pass these two things to the delete_one() method:
The dictionary key is the
"_id"The value is the BSON
ObjectIdthat’s encoded
1 2 3 4 5 6 | col = mongo_client["Some-Database"]["Some Collection"] result = col.delete_one( { "_id" : ObjectId("5cf8c6838dbf4d4c309c3f39") } ) |
NOTE: Always pass the BSON ObjectId to the call method. A DeleteResult object will be returned if you try to pass only the _id string in place of the BSON ObjectId.
>
>Moreover, you’ll get an object NoneType object if you try to pass only _id string in place of the BSON ObjectId when you use the find_one() or find() method.
How to use the delete_many() method
- Pass a Python dictionary that is empty to the
delete_many()method of the collection object to delete all of the documents in a MongoDB collection.
1 2 3 4 5 | result = some_collection.delete_many({}) # print the results of the API call print("API call recieved:", result.acknowledged) print("Documents deleted:", result.deleted_count) |
How to use range queries to delete several documents
Conduct a number or date range deletion by using either:
(
gt) greater than(
lt) less than
Delete one or more documents with a range date that is clear-cut use of these methods:
delete()delete_many()
1 2 3 4 5 | col = db["Some Collection"] # delete all docs before ($lt) a specific date result = col.delete_many({"date": {"$lt": "2015-02-05"}}) print ("delete count:", result.deleted_count) |
- Confirm the deleted documents were actually removed by viewing the object
results.DeleteResult.
NOTE: The API call method Remove() will soon be outdated, so if you try to use it, you’ll raise an exception.
Conclusion
Deleting documents in MongoDB is an ongoing task that keeps your collections clean and uncluttered. As you learned from this tutorial, there are several good ways to delete MongoDB documents Python. These include find_one_and_delete(), delete_one(), and delete_many() methods. One option that will soon be unavailable forever to delete MongoDB documents is the Remove() method. Practice the methods outlined in this tutorial to confidently delete documents PyMongo and raise fewer exceptions.
Just the Code
Here’s a complete code example to remove MongoDB documents Python to use as a guide.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | # import the MongoClient class from pymongo library from pymongo import MongoClient # create a new client instance of MongoClient mongo_client = MongoClient('mongodb://localhost:27017') # find a MongoDB db and col with docs to delete database_list = mongo_client.list_database_names() print ("list_database_names:", database_list) col_list = db.list_collection_names() print ("list_collection_names:", col_list) # get access to a MongoDB database and one of its collections db = mongo_client.some_database col = db.some_collection # find out if it has documents print (col.name, "document total:", col.count_documents({})) # document matching this query will get deleted some_query = {"target field" : "target value"} result = collection_object.find_one_and_delete( some_query ) print("docs deleted:", result.deleted_count) # delete just one doc result = collection_object.delete_one( some_query ) print ("result:", type(result), "-- deleted count:", result.deleted_count) # delete just one AND have the API call return its contents deleted_doc = collection_object.find_one_and_delete( some_query ) print ("deleted:", deleted_doc) # delete many docs using a query query = {"field" : "value"} result = some_collection.delete_many( query ) print("docs deleted:", result.deleted_count) # delete ALL documents on a MongoDB collection result = some_collection.delete_many({}) # print the results of the call print("API call recieved:", result.acknowledged) print("docs deleted:", result.deleted_count) |
Pilot the ObjectRocket Platform Free!
Try Fully-Managed CockroachDB, Elasticsearch, MongoDB, PostgreSQL (Beta) or Redis.
Get Started

