यहां प्रक्रिया वास्तव में काफी सरल है, यह केवल उस स्थान पर भिन्न होता है जहां आप सरणी में तत्वों को "ढूंढना या बनाना" चाहते हैं।
सबसे पहले, यह मानते हुए कि प्रत्येक कुंजी के लिए तत्व पहले से ही मौजूद हैं, फिर साधारण मामला तत्व के लिए क्वेरी करना है और स्थितिगत $
ऑपरेटर:
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"
}
]
}
यह पालन करने के लिए एक सरल पैटर्न है, और निश्चित रूप से यहां बल्क ऑपरेशंस सर्वर से और से कई अनुरोध भेजने और प्राप्त करने में शामिल किसी भी ओवरहेड को हटा देता है। यह सब अन्य तत्वों के साथ हस्तक्षेप किए बिना खुशी से काम करता है जो मौजूद हो सकता है या नहीं भी हो सकता है।
इसके अलावा, आसान क्वेरी और विश्लेषण के लिए डेटा को एक सरणी में रखने के अतिरिक्त लाभ हैं, जैसा कि मानक ऑपरेटरों द्वारा समर्थित है, तत्वों को पार करने के लिए जावास्क्रिप्ट सर्वर प्रोसेसिंग पर वापस जाने की आवश्यकता के बिना।