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