Använd "dot notation" och positionsoperatören i uppdateringsdelen. Förvandla också din inmatning så att den matchar "punktnotation"-formuläret för nyckelrepresentationen:
# Transform to "dot notation" on explicit field
for key in data:
data["mylist.$." + key] = data[key]
del data[key]
# Basically makes
# {
# "mylist.$.data1": "new lorem",
# "mylist.$.data3": "goldeneye"
# }
db.testing.find_and_modify(
query = {"_id": "12345", 'mylist.nested_id' : "1"},
update = { "$set": data }
)
Så det kommer att överföra $
till den faktiska matchade elementpositionen från frågedelen av uppdateringen. Det matchade arrayelementet kommer att uppdateras och med hjälp av "dot notation" kommer endast de nämnda fälten att påverkas.
Har ingen aning om vad "tjänst" ska betyda i detta sammanhang och jag behandlar det bara som ett "transkriberingsfel" eftersom du helt klart försöker matcha ett arrayelement i position.
Det kan vara renare, men det här borde ge dig den allmänna uppfattningen.