मोंगो डीबी में सेव और इंसर्ट में क्या अंतर है?


148

मोंगो डीबी में सेव और इंसर्ट में क्या अंतर है? दोनों एक जैसे दिखते हैं

db.users.save({username:"google",password:"google123"})

db.users.insert({username:"google",password:"google123"})


1
फेइ सेव () अब पिमंगो में पदावनत हो गया है।
गेब्रियल फेयर

जवाबों:


146

सहेजें बनाम डालें:

आपके दिए गए उदाहरणों में, व्यवहार अनिवार्य रूप से समान है।

save यदि इसे "_id" पैरामीटर के साथ पास किया जाता है तो अलग तरह से व्यवहार करता है।

सहेजने के लिए, यदि दस्तावेज़ में सम्‍मिलित है, तो यह फ़ील्ड _idपर संग्रह की क्वेरी को बनाए रखेगा _id, यदि नहीं, तो यह सम्मिलित करेगा।

यदि कोई दस्तावेज़ निर्दिष्ट _id मान के साथ मौजूद नहीं है, तो दस्तावेज़ में निर्दिष्ट फ़ील्ड के साथ सहेजें () विधि एक सम्मिलित करता है।

यदि कोई दस्तावेज़ निर्दिष्ट _id मान के साथ मौजूद है, तो दस्तावेज़ से फ़ील्ड के साथ मौजूदा रिकॉर्ड में सभी फ़ील्ड को बदलने के लिए सहेजें () विधि एक अद्यतन करती है।


अद्यतन बनाम सहेजें :

updateआपके क्वेरी पैरामेट्स के साथ मिलान किए गए मौजूदा दस्तावेज़ को संशोधित करता है। यदि ऐसा कोई मिलान दस्तावेज नहीं है, तो जब upsertचित्र में आता है।

  • upsert : false : ऐसा कुछ भी नहीं होता है जब ऐसा कोई दस्तावेज़ मौजूद नहीं है
  • upsert : true : नया डॉक क्वेरी परम और अपडेट परम के बराबर सामग्री के साथ बनाया जाता है

save: किसी भी क्वेरी-परम की अनुमति नहीं देता है। यदि _idमौजूद है और उसी के साथ एक मेल डॉक है _id, तो वह इसे बदल देता है। जब कोई _id निर्दिष्ट / कोई मेल नहीं करता है, तो यह दस्तावेज़ को एक नए के रूप में सम्मिलित करता है।


8
दोनों के अलग-अलग वाक्य-विन्यास हैं। अपडेट कई तर्क ({कंडीशन}, {update to doc}, upsert, multi) लेता है जबकि केवल एक तर्क (_id सशर्त तर्क के लिए पैरामीटर होने के नाते) को स्वीकार करता है। किसी भी शर्त को स्वीकार कर सकता है, लेकिन सेव केवल स्थिति की सीमा है। मैदान।
राहुल

1
संस्करण 2.6 के रूप में, सेव में एक दूसरा तर्क है, जो दस्तावेज़ को लिखित चिंता व्यक्त करता है। docs.mongodb.org/manual/reference/method/db.collection.save
huggie

77

आइए बचत के लिए यहां दो मामलों पर विचार करें: -

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:       

10
अगले स्तर के चित्र
जॉन स्पिटरी

2
बड़े करीने से चित्र बनाने और आरेखों को प्रस्तुत करने के समय के लिए तैयार किया गया।
फैनबोंडी

36

save डॉक्यूमेंट डालें या अपडेट करें।

insert केवल एक सम्मिलन करता है।

लेकिन आपके मामले में, यह वही करेगा, क्योंकि सेव में दिए गए दस्तावेज़ में कोई _idफ़ील्ड नहीं है ।


13

एक उदाहरण देकर

एक 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"
}

तो सेव एक अपडेट के रूप में कार्य करेगा यदि ऑब्जेक्ट आईडी के साथ आपूर्ति की जाती है, बशर्ते ऑब्जेक्ट आईडी पहले से ही अन्य बुद्धिमान है जो इसे सम्मिलित करता है।


10

यदि आप एक आईडी के साथ "सम्मिलित करें" का उपयोग करने का प्रयास करते हैं जो पहले उसी संग्रह में उपयोग किया गया था तो आपको एक डुप्लिकेट कुंजी त्रुटि मिलेगी। यदि आप "सहेजें" का उपयोग एक आईडी के साथ करते हैं जो पहले से ही एक ही संग्रह में है, तो यह अपडेट / अधिलेखित हो जाएगा।

यदि आप एक सच्चा अपडेट करना चाहते हैं, तो मैं "अपडेट" का उपयोग करने का सुझाव दूंगा। अपडेट उसी तरह से अधिलेखित नहीं होगा, जैसे कि आप उसी आईडी का उपयोग करके सहेज रहे हैं जो पहले से ही संग्रह में है।

उदाहरण के लिए आपके पास दो फ़ील्ड "x" और "y" हैं और आप दोनों को रखना चाहते हैं लेकिन "x" का मान बदल सकते हैं। यदि आपने "सेव" कमांड चुना है और पिछले मूल्य के साथ y को शामिल नहीं किया है या आपके सेव में y बिल्कुल नहीं है, तो y का अब समान मूल्य नहीं होगा या वहां नहीं होगा। हालाँकि यदि आपने $ सेट का उपयोग करके अपडेट करना चुना है और केवल x को ही आपके अपडेट स्टेटमेंट में शामिल किया है, तो आप y को प्रभावित नहीं करेंगे।


6

जैसा कि आप यहां देख सकते हैं, सेव विधि अनिवार्य रूप से एक अपटेरर करेगा (यदि यह डॉक पाता है तो अपडेट करें), अन्यथा:

http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save

इंसर्ट बस एक सीधा इंसर्ट है।


3

नीचे दिए गए दस्तावेज़ पर विचार करें

{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }

अगर db में पहले से ही _id: 1 के साथ दस्तावेज़ मौजूद है, तो

सेव ऑपरेशन नीचे की तरह अपवाद को फेंक देगा

E11000 duplicate key error index ...........

और जहां ऑपरेशन डालें, केवल दस्तावेज़ को ओवरराइड करेगा।


db.collection.save()पद्धति दस्तावेज़ को अपडेट करती है यदि डेटाबेस में समान _id वाला दस्तावेज़ पहले से मौजूद है। जब डेटाबेस में समान _id के साथ एक दस्तावेज़ पहले से मौजूद होता है, तो सहेजने का तरीका नए दस्तावेज़ के साथ दस्तावेज़ को पूरी तरह से बदल देता है। पुस्तक से- प्रो मोंगोडीबी डेवलपमेंट
जैक खाली

1

ORACLE के संदर्भ में: mongo सम्मिलित करें => Oracle सम्मिलित mongo save => Oracle मर्ज करें


1

db.<collection_name>.save(<Document>) InsertOrUpdate क्वेरी के बराबर है।

जबकि, db.<collection_name>.insert(<Document>)केवल क्वेरी सम्मिलित करने के बराबर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.