Usa "dot notation" e l'operatore posizionale nella parte di aggiornamento. Trasforma anche il tuo input in modo che corrisponda al modulo "notazione punto" per la rappresentazione della chiave:
# 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 }
)
Quindi trasposterà $
alla posizione effettiva dell'elemento corrispondente dalla parte della query dell'aggiornamento. L'elemento dell'array corrispondente verrà aggiornato e utilizzando la "notazione del punto" verranno interessati solo i campi menzionati.
Non ho idea di cosa significhi "servizio" in questo contesto e lo sto solo trattando come un "errore di trascrizione" poiché stai chiaramente cercando di abbinare un elemento dell'array in posizione.
Potrebbe essere più pulito, ma dovrebbe darti un'idea generale.