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

सरणी तत्वों का समवर्ती अद्यतन जो MongoDB में एम्बेडेड दस्तावेज़ हैं

यहां प्रक्रिया वास्तव में काफी सरल है, यह केवल उस स्थान पर भिन्न होता है जहां आप सरणी में तत्वों को "ढूंढना या बनाना" चाहते हैं।

सबसे पहले, यह मानते हुए कि प्रत्येक कुंजी के लिए तत्व पहले से ही मौजूद हैं, फिर साधारण मामला तत्व के लिए क्वेरी करना है और स्थितिगत $ ऑपरेटर:

db.collection.update(
   {
       "_id": docId, 
       "attrs": { "$elemMatch": { "key": "A1", "type": "T1" } }
   }
   { "$set": { "attrs.$.value": "20" }
)

यह केवल उस तत्व को संशोधित करेगा जो दूसरों को प्रभावित किए बिना मेल खाता है।

दूसरे मामले में जहां "ढूंढें या बनाएं" आवश्यक है और विशेष कुंजी मौजूद नहीं हो सकती है, तो आप "दो" अपडेट स्टेटमेंट का उपयोग करते हैं। लेकिन बल्क ऑपरेशन API आपको सर्वर से एकल अनुरोध में एकल प्रतिक्रिया के साथ ऐसा करने की अनुमति देता है:

var bulk = db.collection.initializeOrderedBulkOp();

// Try to update where exists
bulk.find({
    "_id": docId,
    "attrs": { "$elemMatch": { "key": "A1", "type": "T2" } }
}).updateOne({
    "$set": { "attrs.$.value": "30" }
});

// Try to add where does noes not exist
bulk.find({
    "_id": docId,
    "attrs": { "$not": { "$elemMatch": { "key": "A1", "type": "T2" } } }
}).updateOne({
    "$push": { "attrs": { "key": "A1", "type": "T2", "value": "30" } }
});

bulk.execute();

मूल तर्क यह है कि पहले अद्यतन का प्रयास पहले की तरह आवश्यक मूल्यों के साथ एक तत्व से मिलान करने के लिए किया जाता है। $not

मामले में जहां सरणी तत्व नहीं मिला था, तो एक नया जोड़ने के लिए मान्य है $push

मुझे वास्तव में यह जोड़ना चाहिए कि चूंकि हम विशेष रूप से यहां नकारात्मक मैचों की तलाश कर रहे हैं, इसलिए "दस्तावेज़" से मिलान करना हमेशा एक अच्छा विचार है जिसे आप कुछ विशिष्ट पहचानकर्ता जैसे कि _id द्वारा अपडेट करना चाहते हैं। चाभी। "बहु" अपडेट के साथ संभव होने पर, आपको सावधान रहना होगा कि आप क्या कर रहे हैं।

तो "ढूंढें या बनाएं" प्रक्रिया को चलाने के मामले में जो तत्व मेल नहीं खाता था, वह अन्य तत्वों के साथ हस्तक्षेप किए बिना, सरणी में सही ढंग से जोड़ा जाता है, अपेक्षित मिलान के लिए पिछला अपडेट भी उसी तरह लागू किया जाता है:

{
    "_id" : ObjectId("55b570f339db998cde23369d"),
    "attrs" : [
            {
                    "key" : "A1",
                    "type" : "T1",
                    "value" : "20"
            },
            {
                    "key" : "A2",
                    "type" : "T2",
                    "value" : "14"
            },
            {
                    "key" : "A1",
                    "type" : "T2",
                    "value" : "30"
            }
    ]
}

यह पालन करने के लिए एक सरल पैटर्न है, और निश्चित रूप से यहां बल्क ऑपरेशंस सर्वर से और से कई अनुरोध भेजने और प्राप्त करने में शामिल किसी भी ओवरहेड को हटा देता है। यह सब अन्य तत्वों के साथ हस्तक्षेप किए बिना खुशी से काम करता है जो मौजूद हो सकता है या नहीं भी हो सकता है।

इसके अलावा, आसान क्वेरी और विश्लेषण के लिए डेटा को एक सरणी में रखने के अतिरिक्त लाभ हैं, जैसा कि मानक ऑपरेटरों द्वारा समर्थित है, तत्वों को पार करने के लिए जावास्क्रिप्ट सर्वर प्रोसेसिंग पर वापस जाने की आवश्यकता के बिना।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मैं उल्का पर एक ऑटो इंक्रीमेंट फ़ील्ड कैसे बना सकता हूँ?

  2. उल्का स्पेसबार टेम्पलेट में अनुक्रमणिका द्वारा वापसी सरणी आइटम

  3. कथन द्वारा सशर्त समूह के साथ MongoDB क्वेरी

  4. Mongoid और ActiveRecord संबंध:अपरिभाषित विधि `quoted_table_name'

  5. mongoDB:$dateToString प्रारूप 15 मिनट के अंतराल से समय दिखाने के लिए