Use "notação de ponto" e o operador posicional na porção de atualização. Transforme também sua entrada para corresponder ao formulário de "notação de ponto" para a representação de chave:
# 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 }
)
Então isso irá transpor
$
para a posição real do elemento correspondente da parte da consulta da atualização. O elemento da matriz correspondente será atualizado e usando "notação de ponto" apenas os campos mencionados serão afetados. Não tenho ideia do que "serviço" deve significar neste contexto e estou apenas tratando-o como um "erro de transcrição", já que você está claramente tentando corresponder um elemento de matriz na posição.
Isso poderia ser mais limpo, mas isso deve lhe dar a ideia geral.