एमोर,
$pull ऑपरेटर आपके द्वारा उपयोग किए जा रहे दस्तावेज़ पर काम नहीं करेगा, क्योंकि "सूचनाएं" -की वास्तव में एक सरणी नहीं है। यह एक एम्बेडेड दस्तावेज़ है, जिसमें क्रमांकित कुंजी हैं, जो इसे सतही रूप से एक सरणी के समान बनाते हैं। इस दस्तावेज़ संरचना को रखने और क्रमांकित कुंजियों का स्वचालित रूप से नाम बदलने का कोई तरीका नहीं है (जो मुझे पता है)।
अगर आप अपने दस्तावेज़ को इस तरह दिखने के लिए थोड़ा रिफलेक्टर करते हैं:
{
"notifications": [
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "1lfw70h789u13a1e67pv"
},
{
"type": "privateMessage",
"fromUname": "Eamorr2",
"time": 1292773522,
"id": "iwoidjsoskqp23nlwof"
}
],
"toUname": "Eamorr"
}
तत्वों को अभी भी गिना जाएगा, परोक्ष रूप से। यह अब एक सरणी है, इसलिए आप इसे मुफ्त में प्राप्त कर सकते हैं। आप इस तरह से $pull ऑपरेटर का उपयोग कर सकते हैं (मैं PHP-ड्राइवर से परिचित नहीं हूं, इसलिए मैं आपको शेल समकक्ष दे रहा हूं):
db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}});
मैंने दस्तावेज़ की पहचान करने के लिए मनमाने ढंग से "toUname" कुंजी का उपयोग किया, लेकिन मुझे लगता है कि आप _id-फ़ील्ड का उपयोग करना चाहेंगे। साथ ही, मैं संदेशों की "आईडी" -की का उपयोग संदेश को सरणी से खींचने के लिए पहचानने के लिए कर रहा हूं, क्योंकि यह बहुत सुरक्षित है और सुनिश्चित करता है कि यदि आप सरणी बदल गए हैं तो आप गलती से गलत संदेश नहीं हटाते हैं आपने हटाने के लिए सरणी क्रमांक की पहचान की है।
मुझे आशा है कि यह मदद करता है।