आप चाहते हैं .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"
. के रूप में चिह्नित अंतिम ऑपरेशन के अलावा यहां मुख्य सहायता है . वह संयोजन सुनिश्चित करता है कि जहां प्राथमिक "दस्तावेज़" पाया जाता है, तब वास्तव में कुछ नहीं होता है, लेकिन जब यह नहीं मिलता है तो नया सरणी आइटम जोड़ा जाता है।
एक साइड नोट के रूप में, मैं दृढ़ता से संख्यात्मक मानों को तारों के बजाय संख्यात्मक के रूप में संग्रहीत करने का दृढ़ता से सुझाव दूंगा। यह न केवल ज्यादातर मामलों में जगह बचाता है बल्कि यह इस तरह से कहीं अधिक उपयोगी भी है।