MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB के साथ नेस्टेड ऐरे को अपडेट करना

सामान्य दायरा और स्पष्टीकरण

आप यहां जो कर रहे हैं उसमें कुछ चीजें गलत हैं। सबसे पहले आपकी क्वेरी शर्तें। आप कई _id . की बात कर रहे हैं वे मान जहां आपको आवश्यकता नहीं होनी चाहिए, और जिनमें से कम से कम एक शीर्ष स्तर पर नहीं है।

"नेस्टेड" मान में प्रवेश करने के लिए और यह भी मान लें कि _id मान अद्वितीय है और किसी अन्य दस्तावेज़ में प्रकट नहीं होगा, आपका प्रश्न प्रपत्र इस प्रकार होना चाहिए:

Model.update(
    { "array1.array2._id": "123" },
    { "$push": { "array1.0.array2.$.answeredBy": "success" } },
    function(err,numAffected) {
       // something with the result in here
    }
);

अब यह वास्तव में काम करेगा, लेकिन वास्तव में यह केवल एक दिखावा है जो यह करता है क्योंकि बहुत अच्छे कारण हैं कि यह आपके लिए काम क्यों नहीं करना चाहिए।

स्थिति संबंधी $ . के लिए आधिकारिक दस्तावेज़ीकरण में महत्वपूर्ण रीडिंग है "नेस्टेड Arrays" विषय के तहत ऑपरेटर। यह क्या कहता है:

<ब्लॉकक्वॉट>

स्थितीय $ ऑपरेटर का उपयोग उन प्रश्नों के लिए नहीं किया जा सकता है जो एक से अधिक सरणी को पार करते हैं, जैसे कि क्वेरी जो अन्य सरणियों के भीतर नेस्टेड सरणियों को पार करती हैं, क्योंकि $ प्लेसहोल्डर के लिए प्रतिस्थापन एक एकल मान है

विशेष रूप से इसका मतलब यह है कि तत्व का मिलान किया जाएगा और स्थितिगत प्लेसहोल्डर में लौटाया जाएगा पहले से अनुक्रमणिका का मान है मिलान सरणी। इसका मतलब है कि आपके मामले में "शीर्ष" स्तर सरणी पर मिलान सूचकांक।

इसलिए यदि आप दिखाए गए अनुसार क्वेरी नोटेशन को देखते हैं, तो हमने पहले . को "हार्डकोड" किया है (या 0 अनुक्रमणिका) शीर्ष स्तर सरणी में स्थिति, और ऐसा ही होता है कि "array2" के भीतर मिलान करने वाला तत्व भी शून्य अनुक्रमणिका प्रविष्टि है।

इसे प्रदर्शित करने के लिए आप मिलान करने वाले _id . को बदल सकते हैं "124" के लिए मान और परिणाम $push . होगा _id . के साथ तत्व पर एक नई प्रविष्टि "123" क्योंकि वे दोनों "सरणी 1" की शून्य अनुक्रमणिका प्रविष्टि में हैं और यह प्लेसहोल्डर को लौटाया गया मान है।

तो घोंसले के शिकार सरणियों के साथ यह सामान्य समस्या है। आप किसी एक स्तर को हटा सकते हैं और फिर भी आप $push . कर पाएंगे आपके "शीर्ष" सरणी में सही तत्व के लिए, लेकिन अभी भी कई स्तर होंगे।

नेस्टिंग सरणियों से बचने की कोशिश करें क्योंकि आप दिखाए गए अनुसार अपडेट समस्याओं में चलेंगे।

सामान्य मामला उन चीजों को "समतल" करना है जिन्हें आप "सोचते हैं" "स्तर" हैं और वास्तव में अंतिम विवरण वस्तुओं पर शोध "विशेषताएं" बनाते हैं। उदाहरण के लिए, प्रश्न में संरचना का "चपटा" रूप कुछ इस तरह होना चाहिए:

 {
   "answers": [
     { "by": "success", "type2": "123", "type1": "12" }
   ]
 }

या आंतरिक सरणी को स्वीकार करते समय भी $push . है केवल, और कभी अपडेट नहीं किया गया:

 {
   "array": [
     { "type1": "12", "type2": "123", "answeredBy": ["success"] },
     { "type1": "12", "type2": "124", "answeredBy": [] }
   ]
 }

जो दोनों खुद को स्थितीय $ . के दायरे में परमाणु अद्यतन के लिए उधार देते हैं ऑपरेटर

MongoDB 3.6 और इसके बाद के संस्करण

MongoDB 3.6 से नेस्टेड सरणियों के साथ काम करने के लिए नई सुविधाएँ उपलब्ध हैं। यह स्थितीय फ़िल्टर किए गए $[<identifier>] . का उपयोग करता है विशिष्ट तत्वों से मेल खाने के लिए वाक्यविन्यास और arrayFilters . के माध्यम से विभिन्न शर्तों को लागू करने के लिए अपडेट स्टेटमेंट में:

Model.update(
  {
    "_id": 1,
    "array1": {
      "$elemMatch": {
        "_id": "12","array2._id": "123"
      }
    }
  },
  {
    "$push": { "array1.$[outer].array2.$[inner].answeredBy": "success" }
  },
  {
    "arrayFilters": [{ "outer._id": "12" },{ "inner._id": "123" }] 
  }
)

"arrayFilters" जैसा कि .update() . के विकल्पों में दिया गया है या यहां तक ​​कि.updateOne() , .updateMany() , .findOneAndUpdate() या .bulkWrite() विधि अद्यतन विवरण में दिए गए पहचानकर्ता से मेल खाने के लिए शर्तों को निर्दिष्ट करती है। दी गई शर्त से मेल खाने वाले सभी तत्वों को अपडेट किया जाएगा।

चूंकि संरचना "नेस्टेड" है, हम वास्तव में "एकाधिक फ़िल्टर" का उपयोग करते हैं जैसा कि दिखाए गए फ़िल्टर परिभाषाओं के "सरणी" के साथ निर्दिष्ट है। चिह्नित "पहचानकर्ता" का उपयोग स्थितीय फ़िल्टर किए गए $[<identifier>] के साथ मिलान में किया जाता है सिंटैक्स वास्तव में स्टेटमेंट के अपडेट ब्लॉक में उपयोग किया जाता है। इस मामले में inner और outer नेस्टेड श्रृंखला के साथ निर्दिष्ट प्रत्येक शर्त के लिए उपयोग किए जाने वाले पहचानकर्ता हैं।

यह नया विस्तार नेस्टेड सरणी सामग्री के अद्यतन को संभव बनाता है, लेकिन यह वास्तव में इस तरह के डेटा को "क्वेरी" करने की व्यावहारिकता में मदद नहीं करता है, इसलिए वही चेतावनी लागू होती है जैसा कि पहले बताया गया है।

आप आमतौर पर "विशेषताओं" के रूप में व्यक्त करने के लिए वास्तव में "मतलब" होते हैं, भले ही आपका मस्तिष्क शुरू में "घोंसले" के बारे में सोचता हो, यह आमतौर पर एक प्रतिक्रिया है कि आप कैसे मानते हैं कि "पिछले संबंधपरक भाग" एक साथ आते हैं। वास्तव में आपको वास्तव में और अधिक अपसामान्यीकरण की आवश्यकता है।

यह भी देखें कि मोंगोडब में एकाधिक ऐरे तत्वों को कैसे अपडेट करें, क्योंकि ये नए अपडेट ऑपरेटर वास्तव में केवल पहले के बजाय "एकाधिक सरणी तत्वों" से मेल खाते हैं और अपडेट करते हैं। , जो स्थितिगत अद्यतनों की पिछली क्रिया रही है।

<ब्लॉकक्वॉट>

नोट कुछ हद तक विडंबना यह है कि यह .update() के लिए "विकल्प" तर्क में निर्दिष्ट है। और विधियों की तरह, सिंटैक्स आम तौर पर सभी हाल के रिलीज़ ड्राइवर संस्करणों के साथ संगत है।

हालांकि यह mongo . के बारे में सच नहीं है खोल, जिस तरह से वहां विधि लागू की गई है ("विडंबना यह है कि पिछड़े संगतता के लिए") arrayFilters तर्क को एक आंतरिक विधि द्वारा पहचाना और हटाया नहीं जाता है जो पिछले MongoDB सर्वर संस्करणों और "विरासत" .update() के साथ "पिछड़ा संगतता" देने के लिए विकल्पों को पार्स करता है। एपीआई कॉल सिंटैक्स।

इसलिए यदि आप mongo . में कमांड का उपयोग करना चाहते हैं शेल या अन्य "खोल आधारित" उत्पाद (विशेषकर रोबो 3T) आपको विकास शाखा से नवीनतम संस्करण या 3.6 या उससे अधिक के उत्पादन रिलीज की आवश्यकता है।

यह भी देखें positional all $[] जो "एकाधिक सरणी तत्वों" को भी अपडेट करता है लेकिन निर्दिष्ट शर्तों पर लागू किए बिना और सभी . पर लागू होता है सरणी में तत्व जहां वांछित क्रिया है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. उल्का उत्पादन डेटाबेस तक पहुंचना

  2. MongoDB प्रतिकृति सरल पासवर्ड प्रमाणीकरण के साथ सेट है

  3. एक निश्चित प्रकार के रिकॉर्ड की सीमित संख्या, लेकिन अन्य रिकॉर्ड की असीमित संख्या लौटाएं?

  4. RedHat/CentOS 7 सिस्टम पर MongoDB 4.2 कैसे स्थापित करें

  5. MongoDB में arrayFilters पैरामीटर कैसे काम करता है