1回の更新操作で複数の配列要素を変更することはできません。したがって、複数の配列要素を変更する必要があるドキュメントを移行するには、更新を繰り返す必要があります。これを行うには、コレクション内の各ドキュメントを繰り返し処理し、$elemMatch
を使用して更新を繰り返し適用します。 ドキュメントの関連するコメントがすべて置き換えられるまで、例:
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); })
この操作の効率がアプリケーションの要件である場合は、ユーザーのアバターの場所がすべてのコメントではなく単一のドキュメントに保存されるようにスキーマを正規化する必要があることに注意してください。