पोजिशनल ऑपरेटर उन स्तरों की संख्या पर काम नहीं करता है जिन पर आप इसे काम करने की कोशिश कर रहे हैं ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system। मुद्दाटैबपैनल%3एक टिप्पणी-टैबपैनल
) menus.$.items.$.name
. के साथ और यहां तक कि अगर उसने MongoDB क्वेरी पार्सर को पता नहीं होगा कि अन्य $
. क्या है find
. से है update
. का ।
आपको स्कीमा से आइटम निकालने होंगे, उसे अलग से अपडेट करना होगा और फिर रूट दस्तावेज़ को अपडेट करना होगा।
जब प्रश्नों को अलग से किया जाना चाहिए, तो निर्णय लेने का एक अच्छा तरीका यह है कि प्रत्येक मेनू एक अलग इकाई (या एक रिलेशनल डेटाबेस में तालिका) की तरह लगता है, इसलिए आपको संभवतः उन एंटाइट्स (या एक रिलेशनल मॉडल में टेबल) को अलग से अपडेट करने पर काम करना चाहिए। मूल इकाई (तालिका)।
तो सबसे पहले आप मुख्य रूट दस्तावेज़ प्राप्त करेंगे। क्लाइंट साइड में इसके मेनू पर स्क्रॉल करें और फिर $set
क्लाइंट साइड पर आपके द्वारा बनाए गए संपूर्ण आइटम के लिए वह विशेष मेनू।
संपादित करें
जिस तरह से मैं इस कार्य क्लाइंट पक्ष की कल्पना करता हूं (छद्म कोड में क्योंकि मेरा जावा थोड़ा जंगली है) पहले उस दस्तावेज़ को सक्रिय रिकॉर्ड फैशन में प्राप्त करके:
doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} ,
"menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});
फिर आप अपने मूल्यों को निर्दिष्ट करने वाले दस्तावेज़ के माध्यम से पुनरावृति करेंगे:
foreach(doc.menus as menu_key => menu){
foreach(menu['items'] as key => item){
if(item._id == { "$oid" : "506e9f07a4e8f5142367942f"}){
doc.menus[menu_key][key][name] = "xcvxc66666"
}
}
}
और फिर सभी परिवर्तन करने के बाद दस्तावेज़ को सरल रूप से सहेजें:
db.col.save(doc);
यह निश्चित रूप से इसे करने का सिर्फ एक तरीका है और इस तरह सक्रिय रिकॉर्ड प्रतिमान का उपयोग करता है जिसे मैं व्यक्तिगत रूप से पसंद करता हूं। इस विचार में आप दस्तावेज़ पर संशोधित करने के लिए आवश्यक सभी चीज़ों के साथ खोज को जोड़ देंगे, इसे क्लाइंट साइड का निर्माण करेंगे और फिर इसे अपने डीबी को एक ही क्वेरी के रूप में भेज देंगे।