MongoDB-এ অ্যারেতে নেস্টেড ডকুমেন্ট খুঁজে বের করে সেটার মধ্যে নতুন এলিমেন্ট যোগ করতে $elemMatch এবং $push একসাথে ব্যবহার করা হয়।
কলেকশন এবং ডকুমেন্ট তৈরি
> db.demo94.insertOne({
... "Details" : [
... { "Name" : "Chris", "Subject" : [] },
... { "Name" : "David", "Subject" : [] },
... { "Name" : "Bob", "Subject" : [] }
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2d553bb8903cdd865577a9") }
সব ডকুমেন্ট দেখানো
> db.demo94.find();
আউটপুট:
{ "_id" : ObjectId("5e2d553bb8903cdd865577a9"), "Details" : [ { "Name" : "Chris", "Subject" : [ ] }, { "Name" : "David", "Subject" : [ ] }, { "Name" : "Bob", "Subject" : [ ] } ] }
একাধিক শর্তে অ্যারে আপডেট করার কোয়ারী
$elemMatch দিয়ে Details অ্যারেতে Name: "David" মিলে যাওয়া এলিমেন্ট খুঁজে, তার Subject অ্যারেতে নতুন অবজেক্ট পুশ করা হয়েছে:
> db.demo94.updateOne(
... { "Details": { "$elemMatch": { "Name": "David" } } },
... { "$push": { "Details.$.Subject": { "Subject": "MongoDB" } } }
... );
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
আপডেটের পর ডকুমেন্ট দেখানো
> db.demo94.find();
আউটপুট (David-এর Subject অ্যারেতে MongoDB যোগ হয়েছে):
{ "_id" : ObjectId("5e2d553bb8903cdd865577a9"), "Details" : [ { "Name" : "Chris", "Subject" : [ ] }, { "Name" : "David", "Subject" : [ { "Subject" : "MongoDB" } ] }, { "Name" : "Bob", "Subject" : [ ] } ] }
গুরুত্বপূর্ণ পয়েন্টসমূহ:
$elemMatch- অ্যারেতে একই এলিমেন্টে একাধিক শর্ত মেলাতে ব্যবহার করা হয়Details.$.Subject- পজিশনাল$অপারেটর কোয়ারীতে মিলে যাওয়া এলিমেন্টকে পয়েন্ট করে$push- অ্যারেতে নতুন এলিমেন্ট যোগ করে
বিকল্প: arrayFilters (MongoDB 3.6+) - আরও পাওয়ারফুল:
db.demo94.updateOne(
{ _id: ObjectId("5e2d553bb8903cdd865577a9") },
{ $push: { "Details.$[elem].Subject": { Subject: "MongoDB" } } },
{ arrayFilters: [ { "elem.Name": "David" } ] }
)
arrayFilters একাধিক শর্ত এবং একাধিক মিলে যাওয়া এলিমেন্ট হ্যান্ডেল করতে বেশি ফ্লেক্সিবল।