2016-06-03 13 views
5

मैं इसMongoDB स्थितीय ऑपरेटर त्रुटि

{ 
    "_id" : ObjectId("5742be02289512cf98bf63e3"), 
    "name" : "test1", 
    "name" : "test1", 
    "attributes" : [ 
     { 
      "name" : "x", 
      "color" : "0xd79c9c", 
      "_id" : ObjectId("5742be02289512cf98bf63e8") 
     }, 
     { 
      "name" : "y", 
      "color" : "0xd79c9c", 
      "_id" : ObjectId("5742be02289512cf98bf63e7") 
     }, 
     { 
      "name" : "z", 
      "color" : "0xd79c9c", 
      "_id" : ObjectId("5742be02289512cf98bf63e6") 
     } 
    ], 
    "__v" : 6 
} 

की तरह वस्तुओं है और मैं सभी दस्तावेजों को अपडेट करना चाहते हैं, और नए क्षेत्र का श्रेय प्रत्येक के लिए निर्धारित किया है। तो मैं एक ही समय में सभी दस्तावेजों को अद्यतन करने के लिए एकल क्वेरी चलाने के लिए चाहता हूं। मुझे लगता है, यह क्वेरी

db.spaces.update({}, { $set: { "attributes.0.weight": 2 } }, {multi: true}) 

लेकिन जब मैं यह क्वेरी चलाता हूं, तो मुझे एक त्रुटि मिलती है।

"कोड": 16,837,
"errmsg": "स्थितीय ऑपरेटर मिलान क्वेरी से की जरूरत नहीं मिला अविस्तृत अद्यतन:। गुण $ वजन।।"

तो मैं समझ में नहीं आता क्यों। कृपया मदद

+0

स्थितित्मक ऑपरेटर का उपयोग करने के लिए आपको क्वेरी दस्तावेज़ के हिस्से के रूप में सरणी फ़ील्ड को शामिल करने की आवश्यकता है। – chridam

+0

@ चिड़ियाम, मैं इसे कैसे कर सकता हूं? – Gor

उत्तर

9

आप क्वेरी दस्तावेज़ के भाग के आदेश positional operator का उपयोग करने के रूप में सरणी क्षेत्र शामिल करने के लिए की जरूरत है।

उदाहरण के लिए

, अगर आप पहले सरणी तत्व { "attributes.name": "x" } के साथ अर्थात् अपडेट करना चाहते हैं तो आप पैटर्न का पालन कर सकते हैं:

db.spaces.update(
    { "attributes.name": "x" }, // <-- the array field must appear as part of the query document. 
    { "$set": { "attributes.$.weight": 2 } }, 
    { "multi": true } 
) 

नए MongoDB संस्करणों 3.2.X के लिए, आप अद्यतन करने के लिए updateMany() विधि इस्तेमाल कर सकते हैं उपरोक्त फ़िल्टर के आधार पर संग्रह के भीतर कई दस्तावेज़।

+2

db.spaces.update ({"विशेषताएँ। नाम": {$ मौजूद है: सत्य}}, {$ सेट: {"विशेषताएँ। $।वजन ": 3}}, {multi: true}) यह क्वेरी सरणी – Gor

+0

में केवल प्रथम आइटम अपडेट करती है मुझे सभी दस्तावेजों के लिए सरणी में सभी तत्वों को अद्यतन करने की आवश्यकता है – Gor

+0

@ गोर ओह, मुझे लगता है कि मुझे – chridam

1

स्थितित्मक ऑपरेटर को आपके अपडेट क्वेरी के मिलान हिस्से से एक मैच की आवश्यकता होती है।

उदाहरण के लिए

:

db.spaces.update({ "attributes.name": "x" }, { $set: { "attributes.0.weight": 2 } }, {multi: true}) 
यहाँ

अद्यतन ऑपरेशन के लिए पहले पैरामीटर सरणी attributes जहां किसी भी तत्व, एक संपत्ति name=="x" है किसी भी eleent कि हालत से मेल खाता है मेल होगा स्थिति ऑपरेटर इसे अद्यतन करने के लिए किया जा सकता ।

तो, क्योंकि name='x', इस मामले में पहले मिलान तत्व हो सकता है,

{ 
      "name" : "x", 
      "color" : "0xd79c9c", 
      "_id" : ObjectId("5742be02289512cf98bf63e8") 
     }, 

और यह अपडेट कर दिया जाएगा।

अब आपके सवाल का मैं समझता हूँ से आप दस्तावेज़ को अद्यतन करने के लिए एक रास्ता है कि प्रत्येक अपनी पहली तत्व दस्तावेज़ में, attributeweight=2 के लिए एक नया मूल्य हो जाता है में चाहते हैं।

आप की तरह

db.spaces.update({ "attributes.name": { $regex: /^(?=[\S\s]{10,8000})[\S\s]*$/ } }, { $set: { "attributes.0.weight": 2 } }, {multi: true}) 

कुछ कर सकते हैं क्या हम यहाँ कर सरणी विशेषता में सभी तत्व से मेल है। और हम उस सरणी के पहले तत्व को अद्यतन करने के लिए स्थितित्मक ऑपरेटर का उपयोग करते हैं

+0

इस सरणी में केवल पहला तत्व अद्यतन करता है – Gor

+0

हाँ .. स्थिति ऑपरेटर ' $ 'और' 0' केवल पहला तत्व को अद्यतन करेगा। –

+0

मैं अपने जवाब अपडेट करेगा –

संबंधित मुद्दे