You need to use the $ positional operator
catalogues.update_one({'services._id': ObjectId(x_id)}, {'$set': {'services.$.age': '30'}})
Full example:
from pymongo import MongoClient
from bson import ObjectId
import pprint
db = MongoClient()['mydatabase']
catalogues = db.catalogues
catalogues.insert_one({
'__v': 78,
'_id': ObjectId('5de4218d6a2be815b9e215e1'),
'services': [
{
'_id': ObjectId('5de4218e6a2be815b9e2186d'),
'name': 'shivam'
},
{
'_id': ObjectId('5de4218e6a2be815b9e2181e'),
'name': 'Shivi'
}
]
})
x_id = '5de4218e6a2be815b9e2181e'
catalogues.update_one({'services._id': ObjectId(x_id)}, {'$set': {'services.$.age': '30'}})
result:
{'__v': 78,
'_id': ObjectId('5de4218d6a2be815b9e215e1'),
'services': [{'_id': ObjectId('5de4218e6a2be815b9e2186d'), 'name': 'shivam'},
{'_id': ObjectId('5de4218e6a2be815b9e2181e'),
'age': '30',
'name': 'Shivi'}]}
CLICK HERE to find out more related problems solutions.