Bạn không thể sửa đổi nhiều phần tử mảng trong một thao tác cập nhật. Do đó, bạn sẽ phải lặp lại cập nhật để di chuyển các tài liệu cần sửa đổi nhiều phần tử mảng. Bạn có thể thực hiện việc này bằng cách lặp lại từng tài liệu trong bộ sưu tập, liên tục áp dụng bản cập nhật với $elemMatch
cho đến khi tài liệu có tất cả các nhận xét liên quan được thay thế, ví dụ:
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); })
Lưu ý rằng nếu hiệu quả của thao tác này là một yêu cầu đối với ứng dụng của bạn, bạn nên chuẩn hóa lược đồ của mình sao cho vị trí của hình đại diện của người dùng được lưu trữ trong một tài liệu duy nhất, thay vì trong mọi nhận xét.