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

सरणी डालें जहां तत्व मौजूद नहीं है और इसे अपडेट करें (कई शर्तों के साथ)

आपके पिछले प्रश्न के समान , आप .bulkWrite() का उपयोग करते हैं लेकिन चूंकि सरणी तत्व चयन में "एकाधिक स्थितियां" हैं, यह वह जगह है जहां आप का उपयोग करते हैं। $elemMatch :

db.collection.bulkWrite([
  { "updateOne": {
    "filter": { 
      "_id": "1", 
      "option": { 
        "$elemMatch": { "weight": "40", "size": "40" }
      }
    },
    "update": { 
      "$set": { "option.$.price": "300" }
    }
  }},
  { "updateOne": {
    "filter": {
      "_id": "1",
      "option": {
        "$not": {
          "$elemMatch": { "weight": "40", "size": "40" }
        }
      }
    },
    "update": {
      "$push": { "option": { "weight": "40", "size": "40",  "price": "300" } }
    }
  }},
  { "updateOne": {
    "filter": { "_id": 1 },
    "update": {
      "$setOnInsert": {
        "option": [
           { "weight": "40", "size": "40",  "price": "300" }
         ]
      }
    },
    "upsert": true
  }}
])

तो संचालन हैं:

  1. $elemMatch मौजूद है और फिर $set मिलान मूल्य।

  2. सरणी तत्व का परीक्षण करें $not नकार में उपस्थित। आप वैकल्पिक रूप से $ne का उपयोग कर सकते हैं प्रत्येक संपत्ति पर, लेकिन उस स्थिति को नकारना जहां दोनों मैच थोड़ा साफ है।

     "$elemMatch": { "weight": { "$ne": "40" }, "size": { "$ne": "40" } }
    

    हर हाल में आप $push नया सरणी तत्व जब एक नहीं आपूर्ति किए गए मानदंडों का मिलान पाया जाता है।

  3. केवल "अप्सर्ट" का प्रयास करें जहां प्राथमिक दस्तावेज़ _id नहीं मिला है, और $setOnInsert का उपयोग करें ताकि यदि दस्तावेज़ मिल जाता है तो यह कार्रवाई कुछ नहीं करती है।

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेवला उप-दस्तावेज़ संपत्ति पर अद्वितीय विशेषता को लागू करता है

  2. स्कीमा में पुनरावर्ती तत्व:नेवला मॉडलिंग

  3. किसी ऑब्जेक्ट को कैसे निर्यात करें जो केवल एसिंक कॉलबैक में उपलब्ध हो?

  4. MongoDB में एक उप-दस्तावेज़ को रूट स्तर में कैसे फ़्लैट करें?

  5. मैं एक उदाहरण विधि में एक नेवला उप-दस्तावेज़ कैसे अद्यतन कर सकता हूँ?