Použijte "tečkovou notaci" a poziční operátor v aktualizační části. Také transformujte svůj vstup tak, aby odpovídal tvaru „tečkové notace“ pro reprezentaci klíče:
# 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 }
)
Takže to transponuje $
na skutečnou pozici odpovídajících prvků z části dotazu aktualizace. Přiřazený prvek pole bude aktualizován a pomocí "tečkové notace" budou ovlivněna pouze zmíněná pole.
Nemám ponětí, co má v tomto kontextu znamenat „služba“, a já to považuji pouze za „chybu přepisu“, protože se jasně snažíte porovnat pozici prvku pole.
To by mohlo být čistší, ale toto by vám mělo poskytnout obecnou představu.