Verwenden Sie "Punktnotation" und den Positionsoperator im Aktualisierungsabschnitt. Wandeln Sie Ihre Eingabe auch so um, dass sie der Form der „Punktnotation“ für die Schlüsseldarstellung entspricht:
# 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 }
)
Das wird also $
transponieren zur tatsächlichen übereinstimmenden Elementposition aus dem Abfrageteil der Aktualisierung. Das übereinstimmende Array-Element wird aktualisiert und bei Verwendung der "Punkt-Notation" werden nur die erwähnten Felder beeinflusst.
Ich habe keine Ahnung, was "Service" in diesem Zusammenhang bedeuten soll, und ich behandle es nur als "Transkriptionsfehler", da Sie eindeutig versuchen, ein Array-Element in Position zu finden.
Das könnte sauberer sein, aber das sollte Ihnen eine ungefähre Vorstellung geben.