find_one_and_update() method in PyMongo is used to find a single document, update it, and return the original or updated document. This is useful when you need to both modify and retrieve a document in one operation. You define a filter to match the document and specify the update using operators like$set.
Syntax
collection.find_one_and_update(filter, update, options)
Parameters:
- filter (dict): A query that matches the document to update.
- update (dict): The update operations to apply (e.g., using $set, $inc, etc.).
- projection (dict, optional): Specifies the fields to return.
- sort (list of tuples, optional):Determines which document to update if multiple match (e.g., [("field", pymongo.ASCENDING)]).
- return_document (optional): Determines whether to return the updated document or the original. Use ReturnDocument.AFTER to return the updated one.
- upsert (bool, optional):If True, inserts a new document if no match is found.
- hint (optional): Index to use for the query.
Let's see some Examples to understand it better.
Sample Collection used in this Article:

Example 1:
PythonfrompymongoimportMongoClientfrompymongoimportReturnDocumentclient=MongoClient('localhost',27017)db=client['GFG']doc=db['Student']# Update Raju's branch to ECE and return the updated documentupdated_doc=doc.find_one_and_update({"_id":5},# You can also use {"name": "Raju"} since both are valid{"$set":{"Branch":"ECE"}},return_document=ReturnDocument.AFTER)print("Updated Document:")print(updated_doc)
Output
Output of find_one_and_update QueryExplanation:
- find_one_and_update() finds the document with_id: 5 and updates the "Branch" to "ECE".
- "$set" operator is used to change only the "Branch" field.
- ReturnDocument.AFTER returns the updated document.
Example 2:
PythonfrompymongoimportMongoClientfrompymongoimportReturnDocumentclient=MongoClient('localhost',27017)db=client['GFG']doc=db['Student']# Update Raju's Roll Numberupdated_doc=doc.find_one_and_update({'name':"Raju"},{'$set':{"Roll No":"1010"}},projection={"name":1,"Roll No":1},return_document=ReturnDocument.AFTER)print("Updated Document:")print(updated_doc)
Output
Output of find_one_and_update QueryExplanation:
- find_one_and_update() finds the document where "name" is "Raju" and updates his "Roll No" to "1010".
- projection limits the returned fields to only "name" and "Roll No".
- ReturnDocument.AFTERreturns the document after the update.
Related Articles: