आपको वह त्रुटि इसलिए मिल रही है क्योंकि आपके पास फ़िल्टर क्लॉज में कोई विधेय नहीं है। आप यह कर सकते हैं:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
और आपको कोई त्रुटि नहीं मिलेगी - वास्तव में किसी एक दस्तावेज़ में id
. होगा विशेषता हटा दी गई। समस्या यह है कि स्थितीय ऑपरेटर केवल उस सरणी के पहले तत्व से मेल खाता है जो आपके विधेय से मेल खाता है, यह सभी तत्वों से मेल नहीं खाता है। बड़ा मुद्दा यह है कि MongoDB (https में एक सरणी में सभी तत्वों को अपडेट करना वर्तमान में संभव नहीं है। ://jira.mongodb.org/browse/SERVER-1243
)।
आपको या तो संख्यात्मक स्थिति ("messages.0.id", "messages.1.id", आदि) का उपयोग करके सरणी में प्रत्येक तत्व के माध्यम से पुनरावृति करने की आवश्यकता होगी या आप सरणी को अपने एप्लिकेशन में खींच सकते हैं, लूप के माध्यम से तत्वों और उन्हें अद्यतन करें, और फिर सरणी को वापस सहेजें।
आप JIRA टिकट से देख सकते हैं कि यह मुद्दा काफी समय से खुला है लेकिन 10gen इसे बहुत उच्च प्राथमिकता नहीं मानता।