2011-03-08 9 views
31

मैं निम्नलिखित की तर्ज पर एक दस्तावेज़ संरचना कुछ है में एक दोगुना-नेस्टेड सरणी से एक तत्व निकालने का तरीका:एक MongoDB दस्तावेज़

{ 
"_id" : "777", 
"someKey" : "someValue", 
"someArray" : [ 
    { 
     "name" : "name1", 
     "someNestedArray" : [ 
      { 
       "name" : "value" 
      }, 
      { 
       "name" : "delete me" 
      } 
     ] 
    } 
    ] 
} 

मैं मान के साथ नेस्टेड सरणी तत्व हटाना चाहते हैं " मुझे हटाओ"।

मुझे पता है कि मैं दस्तावेजों को ढूंढ सकता हूं जो नेस्टेड $ elemMatch अभिव्यक्तियों का उपयोग करके इस विवरण से मेल खाते हैं। प्रश्न में तत्व को हटाने के लिए क्वेरी सिंटैक्स क्या है?

उत्तर

31

प्रश्न में आइटम को हटाने के लिए आप वास्तव में एक अद्यतन का उपयोग करने जा रहे हैं। अधिक विशेष रूप से आप $pull कमांड के साथ एक अद्यतन करने जा रहे हैं जो आइटम को सरणी से हटा देगा।

db.temp.update(
    { _id : "777" }, 
    {$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}} 
) 

"जादू" यहाँ हो रहा का एक छोटा सा नहीं है। .0 का उपयोग करना इंगित करता है कि हम जानते हैं कि हम someArray के 0 वें आइटम को संशोधित कर रहे हैं। {"name":"delete me"} का उपयोग करना इंगित करता है कि हम सटीक डेटा को जानते हैं जिसे हम निकालने की योजना बना रहे हैं।

यह प्रक्रिया ठीक काम करती है यदि आप किसी क्लाइंट में डेटा लोड करते हैं और फिर अद्यतन करते हैं। यदि आप "जेनेरिक" प्रश्न करना चाहते हैं तो यह प्रक्रिया कम अच्छी तरह से काम करती है जो इन परिचालनों को निष्पादित करती है।

मुझे लगता है कि उप-दस्तावेजों के सरणी अद्यतन करने के लिए आम तौर पर यह आसान है कि आपके पास कुछ बिंदु पर स्मृति में मूल हो।


नीचे पहली टिप्पणी के जवाब में, आप शायद डेटा संरचना एक छोटे से

"someObjects" : { 
    "name1": { 
     "someNestedArray" : [ 
      { 
       "name" : "value" 
      }, 
      { 
       "name" : "delete me" 
      } 
     ] 
    } 
} 

अब बदलकर अपनी स्थिति मदद कर सकते हैं {$pull : { "someObjects.name1.someNestedArray" : ...

कर सकते हैं यहाँ अपने संरचना के साथ समस्या है । "उप-सरणी" में हेरफेर करने के लिए मोंगो डीबी का बहुत अच्छा समर्थन नहीं है। आपकी संरचना में वस्तुओं की एक सरणी है और उन वस्तुओं में अधिक वस्तुओं के सरणी हैं।

आप निम्नलिखित संरचना, आप एक कठिन समय $pull जैसी चीजों का उपयोग कर जा रहे हैं है:

array [ 
    { subarray : array [] }, 
    { subarray : array [] }, 
] 

अपने संरचना कि तरह लग रहा है और आप को अद्यतन करने के subarray आपके पास दो विकल्प चाहते हैं:

  1. अपनी संरचना बदलें ताकि आप $pull का लाभ उठा सकें।
  2. $pull का उपयोग न करें। संपूर्ण ऑब्जेक्ट को क्लाइंट में लोड करें और findAndModify का उपयोग करें।
+4

अगर हम के सूचकांक पता नहीं है क्या कुछ आरे में आइटम? मुझे अपने मूल प्रश्न, मेरी माफ़ी में उस शर्त को निर्दिष्ट करना चाहिए था। – rshepherd

+3

जिस तरह से आपने कुछ ऑब्जेक्ट्स नाम 1 निर्दिष्ट किया है, वह काम नहीं कर रहा है? – Lion789

+2

मैं इस मुद्दे के साथ strugling हूँ। मोंगोडीबी ढूंढने और अपडेट करने के लिए दूसरे स्तर के गहरे '$' [पोजिशनल ऑपरेटर] का समर्थन नहीं करता है। –

2

@Melkor टिप्पणी की है के रूप में, (शायद ही के रूप में एक जवाब होना चाहिए)

आप सूचकांक उपयोग नहीं जानते हैं:

{_id: TheMainID, theArray._id: TheArrayID}, {$pull: {"theArray.$.theNestedArray": {_id: theNestedArrayID}}} 
संबंधित मुद्दे