Python MongoDB - find_one_and_update Query
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:
from pymongo import MongoClient
from pymongo import ReturnDocument
client = MongoClient('localhost', 27017)
db = client['GFG']
doc = db['Student']
# Update Raju's branch to ECE and return the updated document
updated_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

Explanation:
- 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:
from pymongo import MongoClient
from pymongo import ReturnDocument
client = MongoClient('localhost', 27017)
db = client['GFG']
doc = db['Student']
# Update Raju's Roll Number
updated_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

Explanation:
- 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.AFTER returns the document after the update.
Related Articles: