MongoDB-এ findOneAndUpdate() দিয়ে অ্যাটোমিক্যালি এক ডকুমেন্ট আপডেট এবং রিটার্ন
findOneAndUpdate() একটি শক্তিশালী মেথড যা একটি ফিল্টার অনুযায়ী প্রথম মিলে যাওয়া ডকুমেন্ট খুঁজে, আপডেট করে, এবং ডিফল্টরূপে আপডেটের পূর্বের অবস্থা রিটার্ন করে। এটি অ্যাটোমিক (Atomic) অপারেশন।
১. কালেকশন ও নমুনা ডেটা তৈরি (ডুপ্লিকেট Name সহ)
db.demo349.insertOne({"Name":"Chris","Marks":56});
{ "acknowledged" : true, "insertedId" : ObjectId("5e55384af8647eb59e5620b4") }
> db.demo349.insertOne({"Name":"David","Marks":78});
{ "acknowledged" : true, "insertedId" : ObjectId("5e553853f8647eb59e5620b5") }
> db.demo349.insertOne({"Name":"Chris","Marks":89});
{ "acknowledged" : true, "insertedId" : ObjectId("5e55385af8647eb59e5620b6") }
> db.demo349.insertOne({"Name":"David","Marks":54});
{ "acknowledged" : true, "insertedId" : ObjectId("5e55385ff8647eb59e5620b7") }
২. আপডেটের আগে সব ডকুমেন্ট
> db.demo349.find();
আউটপুট:
{ "_id" : ObjectId("5e55384af8647eb59e5620b4"), "Name" : "Chris", "Marks" : 56 }
{ "_id" : ObjectId("5e553853f8647eb59e5620b5"), "Name" : "David", "Marks" : 78 }
{ "_id" : ObjectId("5e55385af8647eb59e5620b6"), "Name" : "Chris", "Marks" : 89 }
{ "_id" : ObjectId("5e55385ff8647eb59e5620b7"), "Name" : "David", "Marks" : 54 }
৩. findOneAndUpdate() দিয়ে প্রথম "David" এর Marks ১০ বাড়ানো
> db.demo349.findOneAndUpdate({ "Name" : "David" },{ $inc: { Marks: 10 } });
{ "_id" : ObjectId("5e553853f8647eb59e5620b5"), "Name" : "David", "Marks" : 78 }
ব্যাখ্যা:
- ফিল্টার
{Name: "David"}- দুটি ডকুমেন্ট ম্যাচ করে। findOneAndUpdate- প্রথম ম্যাচ করা ডকুমেন্টটি (ন্যাচারেল অর্ডার/ইনসারশন অর্ডার) আপডেট করে।$inc: {Marks: 10}- Marks ১০ বাড়ায়।- রিটার্ন: আপডেটের পূর্বের ডকুমেন্ট (Marks: 78)।
৪. আপডেটের পর সব ডকুমেন্ট যাচাই
> db.demo349.find();
আউটপুট:
{ "_id" : ObjectId("5e55384af8647eb59e5620b4"), "Name" : "Chris", "Marks" : 56 }
{ "_id" : ObjectId("5e553853f8647eb59e5620b5"), "Name" : "David", "Marks" : 88 }
{ "_id" : ObjectId("5e55385af8647eb59e5620b6"), "Name" : "Chris", "Marks" : 89 }
{ "_id" : ObjectId("5e55385ff8647eb59e5620b7"), "Name" : "David", "Marks" : 54 }
প্রথম "David" (Marks 78) আপডেট হয়ে 88 হয়েছে। দ্বিতীয় "David" (Marks 54) অপরিবর্তিত। sort অপশন দিয়ে কোনটি আপডেট হবে সেটি নিয়ন্ত্রণ করা যায়।