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

ऐरे को अपडेट करें जहां यह मौजूद है या नया ऐरे आइटम डालें

आप चाहते हैं .bulkWrite() इसके लिए। यह वास्तव में एक एकल ऑपरेशन नहीं है, इसलिए आप एक ही अनुरोध में कई ऑपरेशन सबमिट करना चाहते हैं। अनिवार्य रूप से $set के साथ अपडेट लिखने का प्रयास करें जहां डेटा मौजूद है या $push नया डेटा जहां यह मौजूद नहीं है:

db.collection.bulkWrite([
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": "10" },
    "update": { 
      "$set": { "option.$.price": "30" }
    }
  }},
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": { "$ne": "10" } },
    "update": {
      "$push": { "option": { "weight": "10", "price": "30" } }
    }
  }}
])

सकारात्मक मामला केवल मान है, और $ne समानता मिलान को "नकार" करता है, जिसका अर्थ है कि आइटम मौजूद नहीं है। बेशक स्थितिगत $ ऑपरेटर $set के साथ प्रयोग किया जाता है यह कहाँ करता है

डेटा को देखते हुए "बैच" में दो ऑपरेशन भेजे जाने के बावजूद केवल एक ऑपरेशन वास्तव में मेल खाएगा और अपडेट के रूप में लागू होगा।

यदि आप पूरे दस्तावेज़ के लिए "अप्सर्ट्स" भी चाहते हैं, तो आपको उसके अंत में एक और ऑपरेशन जोड़ना होगा। ध्यान दें कि आप अन्य कथनों में से किसी एक पर विकल्प के रूप में "अप्सर्ट" लागू नहीं कर सकते हैं, विशेष रूप से $ne क्योंकि यह एक नया दस्तावेज़ बनाएगा जहां सरणी आइटम मौजूद नहीं है, न कि केवल _id :

db.collection.bulkWrite([
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": "10" },
    "update": { 
      "$set": { "option.$.price": "30" }
    }
  }},
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": { "$ne": "10" } },
    "update": {
      "$push": { "option": { "weight": "10", "price": "30" } }
    }
  }},
  { "updateOne": {
    "filter": { "_id": 1 },
    "update": {
      "$setOnInsert": {
        "option": [
           { "weight": "10", "price": "30" }
         ]
      }
    },
    "upsert": true
  }}
])

$setOnInsert केवल "upsert" . के रूप में चिह्नित अंतिम ऑपरेशन के अलावा यहां मुख्य सहायता है . वह संयोजन सुनिश्चित करता है कि जहां प्राथमिक "दस्तावेज़" पाया जाता है, तब वास्तव में कुछ नहीं होता है, लेकिन जब यह नहीं मिलता है तो नया सरणी आइटम जोड़ा जाता है।

एक साइड नोट के रूप में, मैं दृढ़ता से संख्यात्मक मानों को तारों के बजाय संख्यात्मक के रूप में संग्रहीत करने का दृढ़ता से सुझाव दूंगा। यह न केवल ज्यादातर मामलों में जगह बचाता है बल्कि यह इस तरह से कहीं अधिक उपयोगी भी है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. अलग मॉडल फ़ाइलों में model.export का उपयोग क्यों करें?

  2. Yii2 ऑब्जेक्ट डेटा Json के रूप में वापस पाने में सक्षम नहीं है

  3. MongoDB नोड जोड़ते समय ReplicaSetId संघर्ष

  4. मैं 2.4 C# Mongo ड्राइवर के साथ एक व्याख्या क्वेरी कैसे चलाऊं?

  5. वास्तविक एम्बेडेड दस्तावेज़ के बजाय नेवला [ऑब्जेक्ट] लौट रहा है