Brug "dot notation" og positionsoperatøren i opdateringsdelen. Forvandl også dit input til at matche "punktnotation"-formen for nøglerepræsentationen:
# 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 vil transponere $
til den faktiske matchede elementposition fra forespørgselsdelen af opdateringen. Det matchede array-element vil blive opdateret, og ved brug af "punktnotation" vil kun de nævnte felter blive påvirket.
Aner ikke hvad "service" skal betyde i denne sammenhæng, og jeg behandler det bare som en "transskriberingsfejl", da du tydeligvis forsøger at matche et array-element i position.
Det kunne være renere, men det burde give dig den generelle idé.