Vous ne pouvez pas modifier plusieurs éléments de tableau en une seule opération de mise à jour. Ainsi, vous devrez répéter la mise à jour afin de migrer les documents nécessitant la modification de plusieurs éléments de tableau. Vous pouvez le faire en parcourant chaque document de la collection, en appliquant à plusieurs reprises une mise à jour avec $elemMatch
jusqu'à ce que tous les commentaires pertinents du document soient remplacés, par exemple :
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); })
Notez que si l'efficacité de cette opération est une exigence pour votre application, vous devez normaliser votre schéma de sorte que l'emplacement de l'avatar de l'utilisateur soit stocké dans un seul document, plutôt que dans chaque commentaire.