Anda tidak dapat mengubah beberapa elemen larik dalam satu operasi pembaruan. Jadi, Anda harus mengulangi pembaruan untuk memigrasikan dokumen yang memerlukan beberapa elemen larik untuk dimodifikasi. Anda dapat melakukan ini dengan mengulangi setiap dokumen dalam koleksi, berulang kali menerapkan pembaruan dengan $elemMatch
sampai semua komentar yang relevan diganti pada dokumen, misalnya:
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); })
Perhatikan bahwa jika efisiensi operasi ini merupakan persyaratan untuk aplikasi Anda, Anda harus menormalkan skema sedemikian rupa sehingga lokasi avatar pengguna disimpan dalam satu dokumen, bukan di setiap komentar.