Du kan inte ändra flera arrayelement i en enda uppdateringsåtgärd. Därför måste du upprepa uppdateringen för att migrera dokument som behöver flera arrayelement för att ändras. Du kan göra detta genom att iterera genom varje dokument i samlingen, upprepade gånger tillämpa en uppdatering med $elemMatch
tills dokumentet har ersatt alla relevanta kommentarer, t.ex.:
db.collection.find().forEach( function(doc) { do { db.collection.update({_id: doc._id, comments:{$elemMatch:{user:"test", avatar:{$ne:"new_avatar.jpg"}}}}, {$set:{"comments.$.avatar":"new_avatar.jpg"}}); } while (db.getPrevError().n != 0); })
Observera att om effektiviteten av denna operation är ett krav för din applikation, bör du normalisera ditt schema så att platsen för användarens avatar lagras i ett enda dokument, snarare än i varje kommentar.