Nie można modyfikować wielu elementów tablicy w jednej operacji aktualizacji. W związku z tym będziesz musiał powtórzyć aktualizację, aby przenieść dokumenty, które wymagają modyfikacji wielu elementów tablicy. Możesz to zrobić, przechodząc przez każdy dokument w kolekcji, wielokrotnie stosując aktualizację za pomocą $elemMatch
dopóki w dokumencie nie zostaną zastąpione wszystkie istotne komentarze, np.:
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); })
Pamiętaj, że jeśli wydajność tej operacji jest wymagana dla twojej aplikacji, powinieneś znormalizować swój schemat tak, aby lokalizacja awatara użytkownika była przechowywana w pojedynczym dokumencie, a nie w każdym komentarzu.