MongoDB-এ একটি ডকুমেন্টের ভেতরের অ্যারেতে থাকা নির্দিষ্ট অবজেক্ট আপডেট করার জন্য findOneAndUpdate() মেথড এবং পজিশনাল $ (Positional $) অপারেটর ব্যবহার করা হয়। পজিশনাল $ অপারেটর কুয়েরি ম্যাচ হওয়া অ্যারে এলিমেন্টের ইনডেক্স নির্দেশ করে।
উদাহরণ: কালেকশন ও ডেটা তৈরি
> db.demo553.insertOne({
id: 101,
"Name": "John",
midExamDetails: [
{"SubjectName": "MySQL", "Marks": 70},
{"SubjectName": "MongoDB", "Marks": 35}
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8e3da19e5f92834d7f05ed") }
সব ডকুমেন্ট দেখানো
> db.demo553.find();
আউটপুট:
{ "_id" : ObjectId("5e8e3da19e5f92834d7f05ed"), "id" : 101, "Name" : "John", "midExamDetails" : [
{ "SubjectName" : "MySQL", "Marks" : 70 },
{ "SubjectName" : "MongoDB", "Marks" : 35 }
] }
অ্যারেতে নির্দিষ্ট অবজেক্ট আপডেট করা
SubjectName: "MongoDB" वाले অবজেক্টের Marks ৩৫ থেকে ৯৭ করুন:
> db.demo553.findOneAndUpdate(
{ id: 101, "midExamDetails.SubjectName": "MongoDB" },
{ $set: { 'midExamDetails.$.Marks': 97 } }
);
কোয়েরির ব্যাখ্যা
{ id: 101, "midExamDetails.SubjectName": "MongoDB" }— ফিল্টার:id: 101এবংmidExamDetailsঅ্যারেতেSubjectName: "MongoDB"আছে এমন ডকুমেন্ট।{ $set: { 'midExamDetails.$.Marks': 97 } }—$(পজিশনাল অপারেটর) কুয়েরিতে ম্যাচ হওয়া অ্যারে এলিমেন্টের পজিশন নির্দেশ করে (এখানে ইনডেক্স ১)। শুধু সেই এলিমেন্টেরMarksআপডেট হয়।
আপডেটের পর ডকুমেন্ট দেখানো
> db.demo553.find().pretty();
আউটপুট:
{
"_id" : ObjectId("5e8e3da19e5f92834d7f05ed"),
"id" : 101,
"Name" : "John",
"midExamDetails" : [
{ "SubjectName" : "MySQL", "Marks" : 70 },
{ "SubjectName" : "MongoDB", "Marks" : 97 }
]
}
মূল পয়েন্টসমূহ
- পজিশনাল $ অপারেটর কুয়েরিতে ম্যাচ হওয়া প্রথম অ্যারে এলিমেন্টকে আপডেট করে।
findOneAndUpdate()একক ডকুমেন্ট আপডেট করে এবং আপডেট হওয়ার পূর্বের ডকুমেন্ট রিটার্ন করে (ডিফল্ট)। আপডেট হওয়ার পরের ডকুমেন্ট পেতে{ returnNewDocument: true }অপশন দিন।- এগরিগেশন পাইপলাইনে
$setবা$unsetসহupdateMany()বাupdateOne()ও ব্যবহার করা যায়। - নেস্টেড অ্যারে (array of arrays) এর ক্ষেত্রে
arrayFiltersঅপশন ব্যবহার করা উচিত।