विचाराधीन आइटम को हटाने के लिए आप वास्तव में एक अपडेट का उपयोग करने जा रहे हैं। अधिक विशेष रूप से आप $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
leverage का लाभ उठा सकें । $pull
का उपयोग न करें . संपूर्ण ऑब्जेक्ट को क्लाइंट में लोड करें औरfindAndModify
. का उपयोग करें ।