आपके पिछले प्रश्न
के समान , आप .bulkWrite()
का उपयोग करते हैं
लेकिन चूंकि सरणी तत्व चयन में "एकाधिक स्थितियां" हैं, यह वह जगह है जहां आप का उपयोग करते हैं। $elemMatch
:
db.collection.bulkWrite([
{ "updateOne": {
"filter": {
"_id": "1",
"option": {
"$elemMatch": { "weight": "40", "size": "40" }
}
},
"update": {
"$set": { "option.$.price": "300" }
}
}},
{ "updateOne": {
"filter": {
"_id": "1",
"option": {
"$not": {
"$elemMatch": { "weight": "40", "size": "40" }
}
}
},
"update": {
"$push": { "option": { "weight": "40", "size": "40", "price": "300" } }
}
}},
{ "updateOne": {
"filter": { "_id": 1 },
"update": {
"$setOnInsert": {
"option": [
{ "weight": "40", "size": "40", "price": "300" }
]
}
},
"upsert": true
}}
])
तो संचालन हैं:
-
$elemMatch
मौजूद है और फिर$set
मिलान मूल्य। -
सरणी तत्व का परीक्षण करें
$not
नकार में उपस्थित। आप वैकल्पिक रूप से$ne
का उपयोग कर सकते हैं प्रत्येक संपत्ति पर, लेकिन उस स्थिति को नकारना जहां दोनों मैच थोड़ा साफ है।"$elemMatch": { "weight": { "$ne": "40" }, "size": { "$ne": "40" } }
हर हाल में आप
$push
नया सरणी तत्व जब एक नहीं आपूर्ति किए गए मानदंडों का मिलान पाया जाता है। -
केवल "अप्सर्ट" का प्रयास करें जहां प्राथमिक दस्तावेज़
_id
नहीं मिला है, और$setOnInsert
का उपयोग करें ताकि यदि दस्तावेज़ मिल जाता है तो यह कार्रवाई कुछ नहीं करती है।
पहले की तरह ही, सर्वर पर पूरे बैच को भेजे जाने के बावजूद इनमें से केवल एक ही वास्तव में कुछ भी लिखेगा।