Sie können nicht mehrere Array-Elemente in einem einzigen Aktualisierungsvorgang ändern. Daher müssen Sie die Aktualisierung wiederholen, um Dokumente zu migrieren, für die mehrere Array-Elemente geändert werden müssen. Sie können dies tun, indem Sie jedes Dokument in der Sammlung durchlaufen und wiederholt eine Aktualisierung mit $elemMatch
anwenden bis das Dokument alle relevanten Kommentare ersetzt hat, z. B.:
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); })
Beachten Sie, dass Sie Ihr Schema normalisieren sollten, wenn die Effizienz dieses Vorgangs eine Voraussetzung für Ihre Anwendung ist, sodass der Standort des Benutzeravatars in einem einzigen Dokument und nicht in jedem Kommentar gespeichert wird.