2013-08-21 5 views
6

नोट: कोड निष्पादित करने के लिए कृपया mongodb खोल का उपयोग करें।MongoDB संग्रह में उप-दस्तावेज़ को अद्यतन/हटाएं

समस्या 1:

मान लीजिए कि मैं

{ 
    "_id" : 4, 
"grades" : [ 
    { 
     "grade" : 80, 
     "mean" : 75, 
     "std" : 8 
    }, 
    { 
     "grade" : 85, 
     "mean" : 90, 
     "std" : 5 
    }, 
    { 
     "grade" : 85, 
     "mean" : 90, 
     "std" : 5 
    }, 
    { 
     "grade" : 85, 
     "mean" : 95, 
     "std" : 6 
    }, 
    { 
     "grade" : 90, 
     "mean" : 85, 
     "std" : 5 
    } 
] 
} 

नीचे के रूप में एक छात्र दस्तावेज़ है हम 2 समस्या है माना कि आप के साथ _ id = 4 & & ग्रेड सभी सहायक दस्तावेज़ों को अद्यतन करता चाहता है की सुविधा देता है। ग्रेड = 85 & & ग्रेड.स्टडी = 5, std = 6 के साथ आप

db.students.update({'$and':[ { _id: 4},{ "grades.grade": 85 }, {"grades.std": 5 } ]}, { $set: { "grades.$.std" : 6 } }); 
के रूप में लिखेंगे beacause यह एसटीडी = 5 मैच है +५३६९१३६३२१०

अब अगर आप बयान से ऊपर निष्पादित कई बार (3 बार) तो आदर्श रूप में यह अद्यतन करना चाहिए 2nd, 3rd उप दस्तावेजों

लेकिन पिछले उप दस्तावेज़ भी अद्यतन हो रही है, लेकिन हम $ और$ या के रूप में स्थिति दी गई है, तो आखिरी दस्तावेज़ कैसे अपडेट हो रहा है?

समस्या 2: अब मान लीजिए कि आप subdocument ही क्वेरी मापदंड के साथ मिलान दूर करने के लिए चाहता है। मैं निम्नलिखित की कोशिश की बयान

db.students.update({_id:4,'grades.grade':85},{'$unset':{'grades.$':1}}) 

क्योंकि $ सेट किए बिना उप दस्तावेज/सरणियों के मामले में अशक्त रखा जाएगा, कैसे इस समस्या को हल करने के लिए?

अपने mongodb कंसोल में दोहराने के लिए कैसे?

db.students.insert({ "_id" : 4, "grades" : [ { grade: 80, mean: 75, std: 8 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 95, std: 6 }, { grade: 90, mean: 85, std: 5 } ] }); 

उत्तर

10

'$' ऑपरेटर केवल पहला मैच इसलिए दिए गए अद्यतन करता है:

db.students.insert({ "_id" : 4, "grades" : [ 
    { grade: 80, mean: 75, std: 8 }, 
    { grade: 85, mean: 90, std: 5 }, 
    { grade: 85, mean: 90, std: 5 }, 
    { grade: 85, mean: 95, std: 6 }, 
    { grade: 90, mean: 85, std: 5 } ]}); 

तुम इतनी तरह $elemMatch साथ लक्षित करने की आवश्यकता को अद्यतन करने के लिए:

db.students.update({ _id: 4, "grades": {$elemMatch: {"grade": 85, "std": 5 }}}, 
        { $set: { "grades.$.std" : 6 } }); 

हालांकि, अगर आप दो ग्रेड इससे मिलान नहीं {"grades.grade": 85, "grades.std": 5} और $ केवल पहले अपडेट होते हैं, इसलिए आपको अपडेट होने तक लूप की आवश्यकता होती है:

db.students.update({ _id: 4, "grades": {$elemMatch: {"grade": 85, "std": 5 }}}, 
        { $set: { "grades.$.std" : 6 } }) 
while (db.getLastErrorObj()['n'] > 0) { 
    db.students.update({ _id: 4, "grades": {$elemMatch: {"grade": 85, "std": 5 }}}, 
         { $set: { "grades.$.std" : 6 } }) 
} 

समस्या 2: यही बात लागू होती है - आप $pull मिलान तत्वों के पाश की जरूरत है: समस्या # 1 उल्लेख

db.students.update({_id:4,'grades': {$elemMatch: {'grade':85}}}, {'$pull': {'grades': {'grade':85}}}) 
+0

पहले प्रश्न के उत्तर के लिए धन्यवाद, मैंने पहले से ही @drmirror उत्तर के साथ प्रयास किया है। $ पुल सहायक दस्तावेज़ों के मामले में अशक्त सेट हो जाएगा, तो मैं इसे शून्य पर अद्यतन करने, एक और subdocument से अशक्त दूर करने के लिए के लिए 2 अद्यतन बयान एक निष्पादित करने के लिए किया है। क्या यह एक अपडेट स्टेटमेंट के लिए संभव है? –

+0

2.4 में यह उप दस्तावेज खींच रहा है और शून्य के रूप में सेट नहीं है। – Ross

+0

बेहद क्षमा करें, मेरा बुरा ... यह काम किया ... बहुत बहुत धन्यवाद –

2

आप एक सरणी के अंदर मैच के लिए $elemMatch उपयोग करने के लिए की जरूरत है। MongoDB में क्वेरी नियम निर्दिष्ट करते हैं कि सरणी तत्वों की स्थितियों के लिए, कोई भी सरणी तत्व जहां किसी भी स्थिति मिलान को मिलान माना जाता है। $elemMatch के साथ, सभी शर्तों को एक ही तत्व पर मिलान करने की आवश्यकता है।

+0

क्या आप इसके लिए खोल विवरण लिख सकते हैं? –

+0

क्या दूसरी समस्या हल करना संभव है? –

+0

धन्यवाद .. मैंने $ elemMatch के साथ प्रयास किया और यह काम करता है। लेकिन दूसरी समस्या के लिए। मैं सिर्फ एक उप-दस्तावेज को हटाने के लिए 2 अपडेट स्टेटमेंट निष्पादित नहीं करना चाहता हूं। क्या कोई तरीका है? एक कथन निष्पादन द्वारा –

0

डॉट नोटेशन दस्तावेजों से मेल खाता है कि इसके मानदंड किसी भी सरणी तत्वों में से मिल सकते हैं।

आप तो रूप drmirror पहले से ही उत्तर हैं, तो ऑपरेटर $ elemMatch उपयोग करने की आवश्यकता केवल दस्तावेजों है कि एक सरणी तत्व में अपने सभी मानदंडों से मिलान (कम से कम) मैच के लिए चाहते हैं, यह भी देखें: $elemMatch Operator

आपके मामले में यह होगा:

db.students.update({'$and':[ { _id: 4},{ "grades":{"$elemMatch": {"grade": 85, "std": 5 }}} ]}, { $set: { "grades.$.std" : 6 } }); 

अपने प्रश्न के दूसरे भाग के लिए, सरणी तत्वों को कैसे निकालें, निम्न पोस्ट देखें।

In mongoDb, how do you remove an array element by its index

संक्षेप में, यह एक दो चरणों आपरेशन है कि null तत्व को पहले सेट (आप पहले से ही करते हैं) और फिर इसे $ pull (रों) इसे बंद।

0

के लिए करने के लिए: https://stackoverflow.com/a/20601288/773953

अनिवार्य रूप से आप की सरणी का निर्माण करना होगा आप मैन्युअल रूप से सेट करना चाहते हैं।

संबंधित मुद्दे