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

आईडी के आधार पर दो लेयर नेस्टेड ऑब्जेक्ट को अपडेट करें

आप वास्तव में अपडेट . के साथ अपनी समस्या का समाधान कर सकते हैं विधि, लेकिन यदि आप MongoDB 4.2 या बाद के संस्करण का उपयोग कर रहे हैं तो आपको इसे एक अलग तरीके से करना होगा। दूसरा पैरामीटर $set . हो सकता है ऑपरेशन जिसे आप करना चाहते हैं या एक aggregation पाइपलाइन। बाद में उपयोग करने से आपको डेटा को आकार देने में अधिक स्वतंत्रता मिलती है। इस तरह आप अपनी समस्या का समाधान कर सकते हैं, मैं इसके बाद विश्लेषण करूंगा:

db.collection.update({
  "cards.advanced.unit": 2
},
[
  {
    $set: {
      "cards.advanced": {
        $map: {
          input: "$cards.advanced",
          as: "adv",
          in: {
            cards: {
              $map: {
                input: "$$adv.cards",
                as: "advcard",
                in: {
                  $cond: [
                    {
                      $eq: [
                        "$$advcard.id",
                        "main-2-1"
                      ]
                    },
                    {
                      title: "this is a NEW updated card",
                      id: "$$advcard.id"
                    },
                    "$$advcard"
                  ]
                }
              }
            },
            unit: "$$adv.unit"
          }
        }
      }
    }
  }
],
{
  new: true,
  
});

सबसे पहले अपडेट . का उपयोग करें तीन पैरामीटर पास करने की विधि:

  • फ़िल्टर क्वेरी
  • एकत्रीकरण पाइपलाइन
  • विकल्प। यहाँ मैंने अभी-अभी new: true . का उपयोग किया है अपडेट किए गए दस्तावेज़ को वापस करने और परीक्षण को आसान बनाने के लिए।

यह संरचना है:

db.collection.update({
  "cards.advanced.unit": 2
},
[
  // Pipeline
],
{
  new: true,
});

पाइपलाइन के अंदर हमें केवल एक चरण की आवश्यकता है, $set संपत्ति को बदलने के लिए advanced एक सरणी के साथ हम बनाएंगे।

...
[
  {
    $set: {
      "cards.advanced": {
        // Our first map
      } 
    }
  }
]
...

हम सबसे पहले advanced . को मैप करते हैं बाद में नेस्टेड कार्ड सरणी को मैप करने में सक्षम होने के लिए सरणी:

...
[
  {
    $set: {
      "cards.advanced": {
        $map: {
          input: "$cards.advanced",
          as: "adv",
          in: {
            // Here we will map the nested array
          }
        }     
      } 
    }
  }
]
...

हम पहले मानचित्र पर घोषित चर का उपयोग करते हैं और जिसमें उन्नत सरणी वर्तमान आइटम मैप किया जा रहा है ( adv ) नेस्टेड "कार्ड्स" ऐरे ( $$adv.cards तक पहुँचने और मैप करने के लिए) ):

...
[
  {
    $set: {
      "cards.advanced": {
        $map: {
          input: "$cards.advanced",
          as: "adv",
          in: {
            cards: {
              $map: {
                input: "$$adv.cards",
                as: "advcard",
                in: {
                // We place our condition to check for the chosen card here
                }
              }
            },
            unit: "$$adv.unit",
          }
        }     
      } 
    }
  }
]
...

अंत में हम जांचते हैं कि क्या वर्तमान कार्ड आईडी खोजी जा रही आईडी के बराबर है $eq: [ "$$advcard.id", "main-2-1" ] और नया कार्ड वापस करें यदि यह मेल खाता है या वर्तमान कार्ड:

...
{
  $cond: [
    {
      $eq: [
        "$$advcard.id",
        "main-2-1"
      ]
    },
    {
      title: "this is a NEW updated card",
      id: "$$advcard"
    },
    "$$advcard"
  ]
}

...

जो वर्णित है उसका एक कार्यशील उदाहरण यहां दिया गया है:https://mongoplayground.net/p/xivZGNeD8ng




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेवला डेटाबेस में कई आइटम जोड़ें

  2. अपने क्लाउड डेटाबेस को प्रबंधित करने के लिए AWS पर ClusterControl को कैसे परिनियोजित करें

  3. MongoDB में थोक FindAndModify का समाधान

  4. मॉर्फिया सूची <मानचित्र <स्ट्रिंग, ऑब्जेक्ट>>> वापसी एंबेडेड तत्व खोज ऑपरेशन पर DBObject नहीं है

  5. नेवला एग्रीगेट कमांड का ग्राफ़कॉल एरर रिटर्निंग रिजल्ट