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

ऊपरी विफलताओं में स्थितीय ($) के साथ $पुश करें

अद्यतन क्वेरी में नेस्टेड दस्तावेज़ों में Upsert काम नहीं करेगा,

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

आइए एक उदाहरण इनपुट लें और उदाहरण के अनुसार मामला देखें,

मामला 1: यदि निर्दिष्ट किया गया है messages.from फ़ील्ड messages . में मौजूद है सरणी

var to = "111";
var from = "222";
var subMessage = {
  message: "test",
  date: ISODate("2021-06-29T15:57:53.975Z")
};

खेल का मैदान

मामला 2: अगर messages.from फ़ील्ड सरणी में मौजूद नहीं है

var to = "111";
var from = "333";
var subMessage = {
  message: "test2",
  date: ISODate("2021-06-29T15:57:53.975Z")
};

खेल का मैदान

केस 3: अगर दस्तावेज़ मौजूद नहीं है

var to = "111";
var from = "333";
var subMessage = {
  message: "test2",
  date: ISODate("2021-06-29T15:57:53.975Z")
};

खेल का मैदान

आपकी अंतिम क्वेरी होगी,

  • केवल toचेक करें पूछताछ की स्थिति
  • अद्यतन भाग, स्थिति की जांच करें,
    • अगर from messages . में पाया गया सरणी तब:
      • $map messages . के लूप को पुनरावृत्त करने के लिए सरणी और स्थिति की जाँच करें यदि from फिर मिला वर्तमान subMessages नए इनपुट के साथ सरणी subMessage $concatArrays . का उपयोग करके , $mergeObjects वर्तमान वस्तु को अद्यतन वस्तु के साथ मिलाने के लिए
    • अन्यथा नहीं मिला तो मौजूदा messages में नए संदेश ऑब्जेक्ट सरणी को संक्षिप्त करें $cocnatArrays . का उपयोग करके सरणी
  • upsert: true , संग्रह में नहीं मिलने पर नया दस्तावेज़ सम्मिलित करने के लिए
db.pendingMessages.updateOne(
  { to: to },
  [{
    $set: {
      messages: {
        $cond: [
          { $in: [from, { $ifNull: ["$messages.from", []] }] },
          {
            $map: {
              input: "$messages",
              in: {
                $mergeObjects: [
                  "$$this",
                  {
                    subMessages: {
                      $cond: [
                        { $eq: ["$$this.from", from] },
                        {
                          $concatArrays: ["$$this.subMessages", [subMessage]]
                        },
                        "$$this.subMessages"
                      ]
                    }
                  }
                ]
              }
            }
          },
          {
            $concatArrays: [
              { $ifNull: ["$messages", []] },
              [
                {
                  from: from,
                  subMessages: [subMessage]
                }
              ]
            ]
          }
        ]
      }
    }
  }],
  { upsert: true }
)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB 2.1 एक नाम से मेल खाने वाले ऐरे तत्वों का समग्र फ्रेमवर्क योग

  2. मोंगो में सरणी आकार के साथ फ़ील्ड सम्मिलित करें

  3. mongodb c# API V2:ReplaceOne और FindOneAndReplace के बीच अंतर

  4. MongoDB में एम्बेडेड दस्तावेज़ को सरणी में बदलना

  5. मोंगोडीबी $strLenBytes