Du kan ikke ændre flere array-elementer i en enkelt opdateringshandling. Du bliver derfor nødt til at gentage opdateringen for at migrere dokumenter, som kræver, at flere array-elementer ændres. Du kan gøre dette ved at gentage hvert dokument i samlingen, gentagne gange anvende en opdatering med $elemMatch
indtil dokumentet har erstattet alle relevante kommentarer, f.eks.:
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); })
Bemærk, at hvis effektiviteten af denne handling er et krav for din applikation, bør du normalisere dit skema, således at placeringen af brugerens avatar er gemt i et enkelt dokument, snarere end i hver kommentar.