মঙ্গো ডিবিতে সংরক্ষণ এবং সন্নিবেশ করার মধ্যে পার্থক্য কী?


148

মঙ্গো ডিবিতে সংরক্ষণ এবং সন্নিবেশ করার মধ্যে পার্থক্য কী? উভয় একই দেখায়

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

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


1
fyi save () এখন পাইমোঙ্গোতে অবনতিযুক্ত।
গ্যাব্রিয়েল ফেয়ার

উত্তর:


146

বনাম সন্নিবেশ সংরক্ষণ করুন:

আপনার প্রদত্ত উদাহরণগুলিতে, আচরণটি মূলত একই রকম।

save যদি এটি "_id" প্যারামিটার দিয়ে পাস করা হয় তবে আলাদা আচরণ করে।

সংরক্ষণের জন্য, যদি দস্তাবেজটিতে থাকে _id, এটি _idক্ষেত্রের মধ্যে সংগ্রহটি জিজ্ঞাসাবাদ করবে , যদি না হয় তবে এটি সন্নিবেশ করবে।

যদি নির্দিষ্ট _id মান সহ কোনও দস্তাবেজ উপস্থিত না থাকে তবে সংরক্ষণ () পদ্ধতি নথিতে নির্দিষ্ট ক্ষেত্রগুলি সহ একটি সন্নিবেশ সম্পাদন করে।

নির্দিষ্ট _id মান সহ কোনও নথি উপস্থিত থাকলে, সংরক্ষণ () পদ্ধতিটি একটি আপডেট সম্পাদন করে, নথি থেকে ক্ষেত্রগুলির সাথে বিদ্যমান রেকর্ডের সমস্ত ক্ষেত্রকে প্রতিস্থাপন করে।


আপডেট বনাম আপডেট :

updateআপনার ক্যোয়ারী প্যারামগুলির সাথে মেলে একটি বিদ্যমান নথিটি পরিবর্তন করে। যদি এর সাথে মেলে এমন কোনও নথি না থাকে, যা upsertছবিতে আসে।

  • upsert : false : এ জাতীয় কোনও দলিল উপস্থিত না থাকলে কিছুই হয় না
  • upsert : true : ক্যোয়ারী প্যারাম এবং আপডেট প্যারামের সমান সামগ্রী সহ নতুন ডক তৈরি হবে

save: কোনও জিজ্ঞাসা-প্যারাম অনুমতি দেয় না। যদি _idউপস্থিত থাকে এবং একই সাথে কোনও মিলের ডক থাকে _id, তবে এটি এটি প্রতিস্থাপন করে। যখন কোনও _id নির্দিষ্ট / কোন মিল নেই নথি, এটি নথিকে নতুন হিসাবে সন্নিবেশ করায়।


8
উভয়ের পৃথক বাক্য গঠন রয়েছে। আপডেটে একাধিক যুক্তি ({শর্ত}, doc দস্তাবেজে আপডেট up, উপস্থাপনা, বহু) লাগে তবে সেভ কেবলমাত্র একটি যুক্তি গ্রহণ করে (শর্তাধীন আর্গুমেন্টের জন্য প্যারামিটার থাকা অবস্থায়)। আপডেট কোনও শর্ত মেনে নিতে পারে তবে সংরক্ষণ কেবল শর্তের সীমাবদ্ধতা থাকে _id ক্ষেত্র।
রাহুল

1
সংস্করণ ২.6 হিসাবে, সংরক্ষণের লেখার উদ্বেগ প্রকাশ করার জন্য একটি নথি নিয়ে দ্বিতীয় যুক্তি রয়েছে taking docs.mongodb.org/manual/references/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.

আসুন sertোকানোর জন্য দুটি মামলা বিবেচনা করুন: -

1) সংগ্রহের মধ্যে ডক রেখেছি।

2) সংগ্রহের ক্ষেত্রে ডক না থাকা।

                        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

একটি উদাহরণ দিয়ে

একটি অ্যাপল সংরক্ষণ করুন

db.fruit.save({"name":"apple", "color":"red","shape":"round"})
WriteResult({ "nInserted" : 1 })

db.fruit.find();

{
    "_id" : ObjectId("53fa1809132c1f084b005cd0"),
    "color" : "red",
    "shape" : "round",
    "name" : "apple"
}

পূর্বে সংরক্ষিত আপেলের _id দিয়ে একটি আপেল সংরক্ষণ করুন

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 })

আপডেট করার জন্য একই অবজেক্ট আইডির সাথে কোনও অ্যাপল না থাকায় অ্যাপল sertedোকানো হয়েছে

একটি কমলা sertোকান

db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
WriteResult({ "nInserted" : 1 })

কমলা inোকানো হয়

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

সুতরাং সেভ আপডেট হিসাবে কাজ করবে যদি কোনও অবজেক্ট আইডির সাথে সরবরাহ করা হয় তবে শর্ত থাকে যে অবজেক্ট আইডিটি ইতিমধ্যে অন্য কোনও inোকানো না থাকলে এটি উপস্থিত থাকে।


10

যদি আপনি একই আইডিতে পূর্বে ব্যবহৃত আইডি সহ "সন্নিবেশ" ব্যবহার করার চেষ্টা করেন তবে আপনি একটি সদৃশ কী ত্রুটি পাবেন। আপনি যদি ইতিমধ্যে একই সংগ্রহে থাকা একটি আইডি সহ "সংরক্ষণ করুন" ব্যবহার করেন তবে এটি আপডেট / ওভাররাইট করা হবে।

আপনি যদি একটি সত্য আপডেট করতে চান তবে আমি "আপডেট" ব্যবহার করার পরামর্শ দেব। যদি আপনি ইতিমধ্যে সংগ্রহের মধ্যে থাকা একই আইডি ব্যবহার করে সংরক্ষণ করছেন তবে আপডেট সেভাবে ওভাররাইট হবে না।

উদাহরণস্বরূপ আপনার দুটি ক্ষেত্র "x" এবং "y" রয়েছে এবং আপনি উভয়ই রাখতে চান তবে "x" এর মান পরিবর্তন করতে পারেন। আপনি যদি "সংরক্ষণ করুন" কমান্ডটি বেছে নিয়েছেন এবং y এর সাথে পূর্বের মানটি অন্তর্ভুক্ত না করেছেন বা আপনার সেভে মোটামুটি y না রাখেন, তবে y এর আর একই মান থাকবে না বা থাকবে না। তবে আপনি যদি $ সেট ব্যবহার করে আপডেটটি বেছে নিয়েছেন এবং আপনার আপডেটের বিবৃতিতে কেবল এক্স অন্তর্ভুক্ত করেছেন তবে আপনি y এর উপর প্রভাব ফেলবেন না।


6

আপনি এখানে দেখতে পাচ্ছেন, সংরক্ষণের পদ্ধতিটি মূলত একটি উপস্থাপন করবে (যদি এটি ডকটিকে সন্ধান করে তবে অন্যথায় সন্নিবেশ করান) আপডেট করুন:

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

সন্নিবেশ ঠিক এটি, একটি সরল সন্নিবেশ।


3

নীচের নথিটি বিবেচনা করুন

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

যদি ডিবি ইতিমধ্যে _id: 1 সহ নথিটি নিয়ে থাকে, তবে

সংরক্ষণ অপারেশন নীচের মত ব্যতিক্রম নিক্ষেপ করা হবে

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

এবং যেখানে সন্নিবেশ অপারেশন হিসাবে স্রেফ ডকুমেন্টটিকে ওভাররাইড করবে।


db.collection.save()একই _id এর সাথে একটি ডকুমেন্ট ইতিমধ্যে ডাটাবেসে উপস্থিত থাকলে পদ্ধতিটি নথিকে আপডেট করে। যখন একই _id এর সাথে একটি ডকুমেন্ট ইতিমধ্যে ডাটাবেসে উপস্থিত থাকে সেভ পদ্ধতিটি নতুন দস্তাবেজের সাথে দস্তাবেজটিকে পুরোপুরি প্রতিস্থাপন করে। প্রো মোঙ্গোডিবি বিকাশ বইটি থেকে
জ্যাক ফাঁকা

1

ORACLE এর শর্তাবলী: মঙ্গো সন্নিবেশ => ওরাকল সন্নিবেশ মোঙ্গো সেভ => ওরাকল মার্জ


1

db.<collection_name>.save(<Document>) InsertOrUpdate ক্যোয়ারির সমতুল্য।

যদিও, db.<collection_name>.insert(<Document>)কেবল সন্নিবেশ অনুসন্ধানের সমতুল্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.