प्रश्न में आइटम को हटाने के लिए आप वास्तव में एक अद्यतन का उपयोग करने जा रहे हैं। अधिक विशेष रूप से आप $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
आपके पास दो विकल्प चाहते हैं:
- अपनी संरचना बदलें ताकि आप
$pull
का लाभ उठा सकें।
$pull
का उपयोग न करें। संपूर्ण ऑब्जेक्ट को क्लाइंट में लोड करें और findAndModify
का उपयोग करें।
स्रोत
2011-03-08 18:25:12
अगर हम के सूचकांक पता नहीं है क्या कुछ आरे में आइटम? मुझे अपने मूल प्रश्न, मेरी माफ़ी में उस शर्त को निर्दिष्ट करना चाहिए था। – rshepherd
जिस तरह से आपने कुछ ऑब्जेक्ट्स नाम 1 निर्दिष्ट किया है, वह काम नहीं कर रहा है? – Lion789
मैं इस मुद्दे के साथ strugling हूँ। मोंगोडीबी ढूंढने और अपडेट करने के लिए दूसरे स्तर के गहरे '$' [पोजिशनल ऑपरेटर] का समर्थन नहीं करता है। –