I am having trouble using $push to append a new record to an existing document ID in MongoDB Atlas using Pymongo.
The existing collection in MongoDB Atlas is as follows:
{'_id': ObjectId('60d0a244102671b912874753'),
'entities': [{'uen': '12345678K',
'name': 'COMPANY A',
'persons': [{'personId': 'P123456',
'personIdType': 'Passport/Others',
'personNationality': 'INDIAN',
'personName': 'SOME NAME',
'personRole': 'OFFICER',
'personAddress': {'address1': 'ADDRESS x'}}]}]}
I am trying to append a new person's information who belongs to the same 'COMPANY A' under the same objectID :
{'personId': '34567F',
'personIdType': 'Passport/Others',
'personNationality': 'ABC',
'personName': 'NEW PERSON',
'personRole': 'OFFICER',
'personAddress': {'address1': 'ADDRESS y'}}
So ideally the updated collection will look like:
{'_id': ObjectId('60d0a244102671b912874753'),
'entities': [{'uen': '12345678K',
'name': 'COMPANY A',
'persons': [{'personId': 'P123456',
'personIdType': 'Passport/Others',
'personNationality': 'INDIAN',
'personName': 'SOME NAME',
'personRole': 'OFFICER',
'personAddress': {'address1': 'ADDRESS x'}},
{'personId': '34567F', # Newly appended information
'personIdType': 'Passport/Others',
'personNationality': 'ABC',
'personName': 'NEW PERSON',
'personRole': 'OFFICER',
'personAddress': {'address1': 'ADDRESS y'}}]}]}
The code I am using does not seem to update anything, which I am unsure why:
toPopulate = {'personId': '34567F',
'personIdType': 'Passport/Others',
'personNationality': 'ABC',
'personName': 'NEW PERSON',
'personRole': 'OFFICER',
'personAddress': {'address1': 'ADDRESS y'}}
docID = '60d0a244102671b912874753'
db.my_collection.update_one({'_id': docID},
{'$push': {'entities.persons': toPopulate}})
Is $push the correct method to use? If not, how else can I update my data?
UPDATE:
After adopting user199805's suggestion, the update still did not occur. However, it wasn't an issue with the syntax. Instead, I realized the value of docID
did not contain the correct value. I initially obtained it using
documentId = []
result = db.my_collection.find({'entities.uen': '12345678K'},
{'_id': 1})
for i in result:
documentId.append(i)
docID = str(documentId[0]['_id'])
Which assigned the id '60d0a244102671b912874753'
in string format. This could not be read, and I solved it by removing the str() function, or rather
docID = documentId[0]['_id']
Which gave me ObjectId('60d0a244102671b912874753')
. Passing it to the call to update_one solved the problem successfully. Thank you user199805.