MongoDB-এ গভীর নেস্টেড অ্যারেতে $addToSet ব্যবহার
$addToSet অপারেটর অ্যারেতে মান যোগ করে যদি সেটি ইতিমধ্যে না থাকে। গভীর নেস্টেড স্ট্রাকচারে (অ্যারে ভিতরে অবজেক্ট, তার ভিতরেও অ্যারে) এটি পজিশনাল অপারেটর ($) দিয়ে ব্যবহার করা হয়।
উদাহরণ: নেস্টেড ডিটেইলস সহ ডকুমেন্ট তৈরি
> db.demo380.insertOne({ "details" : [ { "Name" : "Chris", "details1" : [ ] }, { "Name" : "David", "details1" : [ ] } ] });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5b56e32ae06a1609a00b11") }
আপডেট করার আগে
> db.demo380.find().pretty();
{ "_id" : ObjectId("5e5b56e32ae06a1609a00b11"), "details" : [ { "Name" : "Chris", "details1" : [ ] }, { "Name" : "David", "details1" : [ ] } ] }
Name="David" হলে details1 অ্যারেতে অবজেক্ট যোগ করা
> db.demo380.update(
{ "details.Name": "David" },
{ $addToSet: { "details.$.details1": { 'SubjectName': "MongoDB", 'TeacherName':"Bob" } } },
false, true
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
আপডেটের পর
> db.demo380.find().pretty();
{ "_id" : ObjectId("5e5b56e32ae06a1609a00b11"), "details" : [ { "Name" : "Chris", "details1" : [ ] }, { "Name" : "David", "details1" : [ { "SubjectName" : "MongoDB", "TeacherName" : "Bob" } ] } ] }
ব্যাখ্যা
{ "details.Name": "David" }: কুয়েরি - details অ্যারেতে Name="David" থাকা এলিমেন্ট খুঁজে।details.$.details1:$হলো ম্যাচ করা এলিমেন্ট (David), তারdetails1অ্যারে টার্গেট।$addToSet: অবজেক্টটি যদি ইতিমধ্যে থাকে তবে যোগ করবে না (ডুপ্লিকেট প্রতিরোধ)।false, true: আপডেট অপশনস -upsert: false,multi: true(লিগ্যাসি সিনট্যাক্স)।
আধুনিক সিনট্যাক্স (MongoDB 3.6+)
db.demo380.updateOne(
{ "details.Name": "David" },
{ $addToSet: { "details.$[elem].details1": { SubjectName: "MongoDB", TeacherName: "Bob" } } },
{ arrayFilters: [ { "elem.Name": "David" } ] }
)
লाभ: arrayFilters ব্যবহার করা আরও পঠনীয় এবং নেস্টেড লেভেলে কাজ করে।