Gebruik "puntnotatie" en de positionele operator in het updategedeelte. Transformeer ook uw invoer zodat deze overeenkomt met het "puntnotatie"-formulier voor de sleutelweergave:
# 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 }
)
Dus dat transponeert $
naar de werkelijke overeenkomende elementpositie van het querygedeelte van de update. Het overeenkomende array-element wordt bijgewerkt en met behulp van "puntnotatie" worden alleen de genoemde velden beïnvloed.
Ik heb geen idee wat 'service' in deze context zou moeten betekenen en ik behandel het gewoon als een 'transcribeerfout', omdat je duidelijk probeert een array-element in positie te matchen.
Dat zou schoner kunnen zijn, maar dit zou u een algemeen idee moeten geven.