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

pushOrModify मोंगो उप-दस्तावेज़ के लिए ऑपरेटर की तरह

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

db.collection.bulkWrite([
  // Attempt to update the matched element
  { "updateOne": {
    "filter": { 
      "name": "SweetTown",
      "residents.name": "Bob"
    },
    "update": {
      "$set": { "residents.$.reputation": 30 }    
    }
  },
  // $push the element where not matched
  { "updateOne": {
    "filter": {
      "name": "SweetTown",
      "residents.name": { "$ne": "Bob" } 
    },
    "update": { 
      "$push": { 
        "residents": { "name": "Bob", "reputation": 30 } 
      }
    } 
  }}
])

या यदि आप वास्तव में एक "upsert" . शामिल करना चाहते हैं "SweetTown" . के मूल दस्तावेज़ के लिए तो आपको उस चिंता को अपने स्वयं के परीक्षण में अलग करने की आवश्यकता है:

db.collection.bulkWrite([
  // Attempt to update the matched element
  { "updateOne": {
    "filter": { 
      "name": "SweetTown",
      "residents.name": "Bob"
    },
    "update": {
      "$set": { "residents.$.reputation": 30 }    
    }
  },
  // $push the element where not matched
  { "updateOne": {
    "filter": {
      "name": "SweetTown",
      "residents.name": { "$ne": "Bob" } 
    },
    "update": { 
      "$push": { 
        "residents": { "name": "Bob", "reputation": 30 } 
      }
    } 
  }},
  // Only use $setOnInsert when actually an upsert
  { "updateOne": {
      "filter": {
        "name": "SweetTown"
      },
      "update": {
        "$setOnInsert": {
           "residents": [{ "name": "Bob", "reputation": 30 }]
        }
      },
      "upsert": true
  }}
])

तो सामान्य अवधारणा केवल केवल . है $setOnInsert लागू करें कार्रवाई जब एक "upsert" वास्तव में होता है। यह सुनिश्चित करने के लिए कि यह केवल इस मामले में होता है, अन्य संचालन वास्तव में सरणी तत्व को देख रहे हैं "upsert" के साथ चिह्नित नहीं हैं विकल्प। वह हिस्सा उद्देश्य पर है।

आप इसे किसी भी तरह से देखें, यह केवल एक . के लिए ही संभव है डेटाबेस में वास्तव में कोई भी संशोधन करने के लिए, क्योंकि या तो तत्व पाया गया है या नहीं, या यहां तक ​​कि दस्तावेज़ भी नहीं मिला है और एक नया बनाया गया है।

किसी भी मामले में एक अद्यतन विवरण में उस तरह का ऑपरेशन करना संभव नहीं है। हालांकि चूंकि "बल्क" ऑपरेशन वास्तव में केवल एक हैं एक . के साथ अनुरोध करें प्रतिक्रिया दें, तो जहाँ तक आपके आवेदन का संबंध है तो उसे केवल सर्वर से बात करने की आवश्यकता है एक बार सर्वर को इन तीनों चीजों को आजमाने और प्रतिक्रिया देने के लिए।

डायरेक्ट बल्क एपीआई के पहले उपयोग के लिए, वैकल्पिक सिंटैक्स है:

var bulk = db.collection.initializeOrderedBulkOp();

// $set matched where existing
bulk.find({ "name": "SweetTown", "residents.name": "Bob" }).updateOne({
  "$set": { "residents.$.reputation": 30 }
});

// $push where not existing
bulk.find({ "name": "SweetTown", "residents.name": { "$ne": "Bob" } }).updateOne({
  "$push": { "residents": { "name": "Bob", "reputation": 30 } }
});

// Attempt to upsert only
bulk.find({ "name": "SweetTown" }).upsert().updateOne({
  "$setOnInsert": {
    "residents": [{ "name": "Bob", "reputation": 30 }]
  }
})

bulk.execute();



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB संग्रह को दूसरे संग्रह में ले जाने का बेहतर तरीका

  2. MongoDB इंस्टेंस या रेप्लिका सेट की क्लोनिंग

  3. आरईएसटी एपीआई से लौटाई गई छवि हमेशा टूटी हुई प्रदर्शित होती है

  4. नेवला का डिफ़ॉल्ट वादा पुस्तकालय MEAN स्टैक में बहिष्कृत है

  5. मोंगोडब, शार्डिंग और कई विंडोज़ सेवाएं