MongoDB में कई अपडेट ऑपरेशंस में अप्सर्ट होने की संभावना है। एक अप्सर्ट एक इंसर्ट और एक अपडेट का संयोजन है।
यह इस तरह काम करता है:आप फ़िल्टर मानदंड के आधार पर एक अपडेट ऑपरेशन करते हैं, और यदि कोई मिलान है, तो केवल मिलान किए गए दस्तावेज़ अपडेट किए जाते हैं, लेकिन यदि कोई मेल नहीं है, तो एक नया दस्तावेज़ डाला जाता है।
उदाहरण
मान लीजिए हमारे पास pets
. नामक संग्रह है जिसमें निम्नलिखित दस्तावेज शामिल हैं:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
हम निम्नलिखित अपडेट ऑपरेशन कर सकते हैं जो upsert
. सेट करता है true
. के लिए पैरामीटर :
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
)
परिणाम:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
इस मामले में, एक मेल खाने वाला दस्तावेज़ था (यानी name: "Wag"
वाला एक दस्तावेज़ है ) और इसलिए मिलान करने वाले दस्तावेज़ को अद्यतन किया गया था। कुछ भी नहीं डाला गया।
हम इसे इस प्रकार सत्यापित कर सकते हैं:
db.pets.find()
परिणाम:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
पहले दस्तावेज़ में अब type
है Cow
. का ।
चलिए एक और अपडेट ऑपरेशन चलाते हैं, फिर से upsert: true
. का उपयोग करते हुए . लेकिन इस बार, अपडेट करने के लिए कोई मेल खाने वाला दस्तावेज़ नहीं होगा।
db.pets.updateOne(
{ name: "Bubbles" },
{ $set: { type: "Fish" } },
{ upsert: true }
)
परिणाम:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1b4c8d9914101694100b7") }
इस उदाहरण में, हम name: "Bubbles"
. वाले दस्तावेज़ को खोजने का प्रयास करते हैं लेकिन कोई नहीं मिला।
इस बार हम देख सकते हैं कि matchedCount
है 0
, और modifiedCount
0
. भी है . इसका मतलब है कि मौजूदा दस्तावेजों में से कोई भी अपडेट नहीं किया गया था।
हम यह भी देख सकते हैं कि एक upsertedId
लौटा दिया गया था, जिसका अर्थ है कि एक दस्तावेज़ को हटा दिया गया था।
आइए दस्तावेज़ों के संग्रह पर एक और नज़र डालें:
db.pets.find()
परिणाम:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe1b4c8d9914101694100b7"), "name" : "Bubbles", "type" : "Fish" }
हम देख सकते हैं कि एक नया दस्तावेज़ डाला / डाला गया था और इसमें वही आईडी है जो ऊपर बताई गई है।
अप्सर्ट इसलिए हुआ क्योंकि इस बार अपडेट करने के लिए कोई मिलान करने वाला दस्तावेज़ नहीं था (और इसलिए इसके बजाय एक नया डाला गया/अपरक्षित किया गया)।
अगर हमने upsert: true
. सेट नहीं किया होता , वह दस्तावेज़ सम्मिलित नहीं किया गया होता।
बल्क अपडेट पर अप्सर्ट करें
बल्क अपडेट करते समय, यदि आप निर्दिष्ट करना चाहते हैं upsert: true
, आपको इसे Bulk.find.upsert()
. के साथ उपयोग करने की आवश्यकता है ।
इसका उपयोग निम्नलिखित लेखन कार्यों के साथ किया जा सकता है:
Bulk.find.replaceOne()
Bulk.find.updateOne()
Bulk.find.update()
वाक्य रचना इस प्रकार है:
Bulk.find(<query>).upsert().update(<update>);
Bulk.find(<query>).upsert().updateOne(<update>);
Bulk.find(<query>).upsert().replaceOne(<replacement>);
उदाहरण:
var bulk = db.pets.initializeUnorderedBulkOp();
bulk.find( { name: "Bruce" } ).upsert().replaceOne(
{
name: "Bruce",
type: "Bat",
}
);
bulk.execute();
परिणाम:
BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 0, "nUpserted" : 1, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ { "index" : 0, "_id" : ObjectId("5fe1c179d9914101694100dd") } ] })
हम देख सकते हैं कि एक दस्तावेज़ को जोड़ा गया था। हम _id
. भी देख सकते हैं जो उस दस्तावेज़ के लिए जनरेट किया गया था।
अब जब हम अपने संग्रह में दस्तावेज़ देखते हैं, तो हम उस नए दस्तावेज़ को देख सकते हैं जो ऊपर किया गया था:
db.pets.find()
परिणाम:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe1b4c8d9914101694100b7"), "name" : "Bubbles", "type" : "Fish" } { "_id" : ObjectId("5fe1c179d9914101694100dd"), "name" : "Bruce", "type" : "Bat" }