মঙ্গো ডিবিতে সংরক্ষণ এবং সন্নিবেশ করার মধ্যে পার্থক্য কী? উভয় একই দেখায়
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.
আসুন 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:
save
একটি দস্তাবেজ সন্নিবেশ বা আপডেট করুন।
insert
কেবল একটি সন্নিবেশ করায়।
তবে আপনার ক্ষেত্রে এটি একই কাজ করবে, যেমন সংরক্ষণে সরবরাহ করা দস্তাবেজের কোনও _id
ক্ষেত্র নেই।
একটি উদাহরণ দিয়ে
একটি অ্যাপল সংরক্ষণ করুন
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োকানো না থাকলে এটি উপস্থিত থাকে।
যদি আপনি একই আইডিতে পূর্বে ব্যবহৃত আইডি সহ "সন্নিবেশ" ব্যবহার করার চেষ্টা করেন তবে আপনি একটি সদৃশ কী ত্রুটি পাবেন। আপনি যদি ইতিমধ্যে একই সংগ্রহে থাকা একটি আইডি সহ "সংরক্ষণ করুন" ব্যবহার করেন তবে এটি আপডেট / ওভাররাইট করা হবে।
আপনি যদি একটি সত্য আপডেট করতে চান তবে আমি "আপডেট" ব্যবহার করার পরামর্শ দেব। যদি আপনি ইতিমধ্যে সংগ্রহের মধ্যে থাকা একই আইডি ব্যবহার করে সংরক্ষণ করছেন তবে আপডেট সেভাবে ওভাররাইট হবে না।
উদাহরণস্বরূপ আপনার দুটি ক্ষেত্র "x" এবং "y" রয়েছে এবং আপনি উভয়ই রাখতে চান তবে "x" এর মান পরিবর্তন করতে পারেন। আপনি যদি "সংরক্ষণ করুন" কমান্ডটি বেছে নিয়েছেন এবং y এর সাথে পূর্বের মানটি অন্তর্ভুক্ত না করেছেন বা আপনার সেভে মোটামুটি y না রাখেন, তবে y এর আর একই মান থাকবে না বা থাকবে না। তবে আপনি যদি $ সেট ব্যবহার করে আপডেটটি বেছে নিয়েছেন এবং আপনার আপডেটের বিবৃতিতে কেবল এক্স অন্তর্ভুক্ত করেছেন তবে আপনি y এর উপর প্রভাব ফেলবেন না।
আপনি এখানে দেখতে পাচ্ছেন, সংরক্ষণের পদ্ধতিটি মূলত একটি উপস্থাপন করবে (যদি এটি ডকটিকে সন্ধান করে তবে অন্যথায় সন্নিবেশ করান) আপডেট করুন:
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
সন্নিবেশ ঠিক এটি, একটি সরল সন্নিবেশ।
নীচের নথিটি বিবেচনা করুন
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
যদি ডিবি ইতিমধ্যে _id: 1 সহ নথিটি নিয়ে থাকে, তবে
সংরক্ষণ অপারেশন নীচের মত ব্যতিক্রম নিক্ষেপ করা হবে
E11000 duplicate key error index ...........
এবং যেখানে সন্নিবেশ অপারেশন হিসাবে স্রেফ ডকুমেন্টটিকে ওভাররাইড করবে।
db.collection.save()
একই _id এর সাথে একটি ডকুমেন্ট ইতিমধ্যে ডাটাবেসে উপস্থিত থাকলে পদ্ধতিটি নথিকে আপডেট করে। যখন একই _id এর সাথে একটি ডকুমেন্ট ইতিমধ্যে ডাটাবেসে উপস্থিত থাকে সেভ পদ্ধতিটি নতুন দস্তাবেজের সাথে দস্তাবেজটিকে পুরোপুরি প্রতিস্থাপন করে। প্রো মোঙ্গোডিবি বিকাশ বইটি থেকে
db.<collection_name>.save(<Document>)
InsertOrUpdate ক্যোয়ারির সমতুল্য।
যদিও, db.<collection_name>.insert(<Document>)
কেবল সন্নিবেশ অনুসন্ধানের সমতুল্য।