आप एकल अद्यतन कार्रवाई में एकाधिक सरणी तत्वों को संशोधित नहीं कर सकते हैं। इस प्रकार, आपको उन दस्तावेज़ों को माइग्रेट करने के लिए अद्यतन दोहराना होगा जिन्हें संशोधित करने के लिए एकाधिक सरणी तत्वों की आवश्यकता होती है। आप संग्रह में प्रत्येक दस्तावेज़ के माध्यम से पुनरावृत्ति करके, $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); })
ध्यान दें कि यदि इस ऑपरेशन की दक्षता आपके आवेदन के लिए एक आवश्यकता है, तो आपको अपनी स्कीमा को सामान्य बनाना चाहिए ताकि उपयोगकर्ता के अवतार का स्थान प्रत्येक टिप्पणी के बजाय एक दस्तावेज़ में संग्रहीत हो।