MongoDB-এ অগ্রেশন পাইপলাইন থেকে সরাসরি আপডেট করা যায় না; update() ব্যবহার করুন
MongoDB-এ অগ্রেশন পাইপলাইন (aggregate()) শুধু রিড-অনলি অপারেশন; এটি ডকুমেন্ট আপডেট করতে পারে না। ডকুমেন্ট আপডেট করতে updateOne(), updateMany() বা findOneAndUpdate() ব্যবহার করতে হয়।MongoDB 4.2+ এ update কমান্ডে অগ্রেশন পাইপলাইন ব্যবহার করা যায়।
উদাহরণ: নেস্টেড ডিটেইলস সহ ডকুমেন্ট তৈরি
> db.demo376.insertOne({ "id" :101, "details" : [ { "Name":"Chris", "Age":21, "Score":45 }, { "Name":"David", "Age":23, "Score":67 }, { "Name":"Bob", "Age":20, "Score":54 } ] });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a71b92ae06a1609a00b0d") }
আপডেট করার আগে
> db.demo376.find().pretty();
{ "_id" : ObjectId("5e5a71b92ae06a1609a00b0d"), "id" : 101, "details" : [ { "Name" : "Chris", "Age" : 21, "Score" : 45 }, { "Name" : "David", "Age" : 23, "Score" : 67 }, { "Name" : "Bob", "Age" : 20, "Score" : 54 } ] }
আপডেট কুয়েরি: arrayFilters ব্যবহার করে শর্তসাপেক্ষ আপডেট
> db.demo376.update(
{ "id" :101 },
{ $inc: { "details.$[d].Age": 3 } },
{ arrayFilters: [ { $and: [ { "d.Age": 21 }, { "d.Score": { "$gt": 40 } } ] } ] }
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
আপডেটের পর (Chris-এর Age 21 → 24)
> db.demo376.find().pretty();
{ "_id" : ObjectId("5e5a71b92ae06a1609a00b0d"), "id" : 101, "details" : [ { "Name" : "Chris", "Age" : 24, "Score" : 45 }, { "Name" : "David", "Age" : 23, "Score" : 67 }, { "Name" : "Bob", "Age" : 20, "Score" : 54 } ] }
ব্যাখ্যা
arrayFilters: আপডেট করার এলিমেন্টের শর্ত ডিফাইন করে (d.Age=21এবংd.Score>40)।details.$[d].Age:$[d]হলো ফিল্টার করা এলিমেন্টের প্লেসহোল্ডার।$inc: 3: Age ৩ বাড়ায়।
MongoDB 4.2+ এ অগ্রেশন পাইপলাইন আপডেট
db.demo376.updateOne(
{ "id": 101 },
[ { $set: { "details.$[d].Age": { $add: ["$$d.Age", 3] } } } ],
{ arrayFilters: [ { "d.Age": 21, "d.Score": { $gt: 40 } } ] }
)
মূল কথা: আপডেটের জন্য আপডেট মেথড ব্যবহার করুন; অগ্রেশন শুধু ডেটা পড়তে।