मोंगो डीबी में सेव और इंसर्ट में क्या अंतर है? दोनों एक जैसे दिखते हैं
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
मोंगो डीबी में सेव और इंसर्ट में क्या अंतर है? दोनों एक जैसे दिखते हैं
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
जवाबों:
सहेजें बनाम डालें:
आपके दिए गए उदाहरणों में, व्यवहार अनिवार्य रूप से समान है।
save
यदि इसे "_id" पैरामीटर के साथ पास किया जाता है तो अलग तरह से व्यवहार करता है।
सहेजने के लिए, यदि दस्तावेज़ में सम्मिलित है, तो यह फ़ील्ड _id
पर संग्रह की क्वेरी को बनाए रखेगा _id
, यदि नहीं, तो यह सम्मिलित करेगा।
यदि कोई दस्तावेज़ निर्दिष्ट _id मान के साथ मौजूद नहीं है, तो दस्तावेज़ में निर्दिष्ट फ़ील्ड के साथ सहेजें () विधि एक सम्मिलित करता है।
यदि कोई दस्तावेज़ निर्दिष्ट _id मान के साथ मौजूद है, तो दस्तावेज़ से फ़ील्ड के साथ मौजूदा रिकॉर्ड में सभी फ़ील्ड को बदलने के लिए सहेजें () विधि एक अद्यतन करती है।
अद्यतन बनाम सहेजें :
update
आपके क्वेरी पैरामेट्स के साथ मिलान किए गए मौजूदा दस्तावेज़ को संशोधित करता है। यदि ऐसा कोई मिलान दस्तावेज नहीं है, तो जब upsert
चित्र में आता है।
upsert : false
: ऐसा कुछ भी नहीं होता है जब ऐसा कोई दस्तावेज़ मौजूद नहीं हैupsert : true
: नया डॉक क्वेरी परम और अपडेट परम के बराबर सामग्री के साथ बनाया जाता हैsave
: किसी भी क्वेरी-परम की अनुमति नहीं देता है। यदि _id
मौजूद है और उसी के साथ एक मेल डॉक है _id
, तो वह इसे बदल देता है। जब कोई _id निर्दिष्ट / कोई मेल नहीं करता है, तो यह दस्तावेज़ को एक नए के रूप में सम्मिलित करता है।
आइए बचत के लिए यहां दो मामलों पर विचार करें: -
1) डॉक में _id होना।
2) डॉक्टर में नहीं है।
Save ()
/ \
/ \
Having _id Not Having _id
->In this case save will do -> It will do normal insertion
upsert to insert.Now in this case as insert() do.
what that means, it means
take the document and replace
the complete document having same
_id.
आइए डालने के लिए यहां दो मामलों पर विचार करें: -
1) संग्रह में doc के _id का होना।
2) संग्रह में doc की _id नहीं।
Insert()
/ \
/ \
Doc Having _id in collection Doc Not Having _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
save
डॉक्यूमेंट डालें या अपडेट करें।
insert
केवल एक सम्मिलन करता है।
लेकिन आपके मामले में, यह वही करेगा, क्योंकि सेव में दिए गए दस्तावेज़ में कोई _id
फ़ील्ड नहीं है ।
एक उदाहरण देकर
एक Apple सहेजें
db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "red",
"shape" : "round",
"name" : "apple"
}
पहले से सहेजे गए सेब के ढक्कन के साथ एक सेब को बचाएं
db.fruit.save(
{"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple",
"color":"real red","shape":"round"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
अब हमने जो सेब बचाया है, उसका रंग लाल से असली लाल तक है
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
_Id के साथ एक सेब सहेजें
db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
"name":"apple", "color":"real red","shape":"round"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1,
"nModified" : 0, "_id": 55551809132c1f084b005cd0 })
ऐप्पल डाला गया क्योंकि अपडेट करने के लिए समान ऑब्जेक्ट आईडी के साथ कोई सेब नहीं है
एक नारंगी डालें
db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })
संतरा डाला जाता है
db.fruit.find();
{
"_id" : ObjectId("53fa1809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
{
"_id" : ObjectId("53fa196d132c1f084b005cd7"),
"color" : "orange",
"shape" : "round",
"name" : "orange"
}
{
"_id" : ObjectId("55551809132c1f084b005cd0"),
"color" : "real red",
"shape" : "round",
"name" : "apple"
}
तो सेव एक अपडेट के रूप में कार्य करेगा यदि ऑब्जेक्ट आईडी के साथ आपूर्ति की जाती है, बशर्ते ऑब्जेक्ट आईडी पहले से ही अन्य बुद्धिमान है जो इसे सम्मिलित करता है।
यदि आप एक आईडी के साथ "सम्मिलित करें" का उपयोग करने का प्रयास करते हैं जो पहले उसी संग्रह में उपयोग किया गया था तो आपको एक डुप्लिकेट कुंजी त्रुटि मिलेगी। यदि आप "सहेजें" का उपयोग एक आईडी के साथ करते हैं जो पहले से ही एक ही संग्रह में है, तो यह अपडेट / अधिलेखित हो जाएगा।
यदि आप एक सच्चा अपडेट करना चाहते हैं, तो मैं "अपडेट" का उपयोग करने का सुझाव दूंगा। अपडेट उसी तरह से अधिलेखित नहीं होगा, जैसे कि आप उसी आईडी का उपयोग करके सहेज रहे हैं जो पहले से ही संग्रह में है।
उदाहरण के लिए आपके पास दो फ़ील्ड "x" और "y" हैं और आप दोनों को रखना चाहते हैं लेकिन "x" का मान बदल सकते हैं। यदि आपने "सेव" कमांड चुना है और पिछले मूल्य के साथ y को शामिल नहीं किया है या आपके सेव में y बिल्कुल नहीं है, तो y का अब समान मूल्य नहीं होगा या वहां नहीं होगा। हालाँकि यदि आपने $ सेट का उपयोग करके अपडेट करना चुना है और केवल x को ही आपके अपडेट स्टेटमेंट में शामिल किया है, तो आप y को प्रभावित नहीं करेंगे।
जैसा कि आप यहां देख सकते हैं, सेव विधि अनिवार्य रूप से एक अपटेरर करेगा (यदि यह डॉक पाता है तो अपडेट करें), अन्यथा:
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
इंसर्ट बस एक सीधा इंसर्ट है।
नीचे दिए गए दस्तावेज़ पर विचार करें
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
अगर db में पहले से ही _id: 1 के साथ दस्तावेज़ मौजूद है, तो
सेव ऑपरेशन नीचे की तरह अपवाद को फेंक देगा
E11000 duplicate key error index ...........
और जहां ऑपरेशन डालें, केवल दस्तावेज़ को ओवरराइड करेगा।
db.collection.save()
पद्धति दस्तावेज़ को अपडेट करती है यदि डेटाबेस में समान _id वाला दस्तावेज़ पहले से मौजूद है। जब डेटाबेस में समान _id के साथ एक दस्तावेज़ पहले से मौजूद होता है, तो सहेजने का तरीका नए दस्तावेज़ के साथ दस्तावेज़ को पूरी तरह से बदल देता है। पुस्तक से- प्रो मोंगोडीबी डेवलपमेंट
db.<collection_name>.save(<Document>)
InsertOrUpdate क्वेरी के बराबर है।
जबकि, db.<collection_name>.insert(<Document>)
केवल क्वेरी सम्मिलित करने के बराबर है।