$group, $match, $all, $elemMatch ব্যবহার করে কম্বাইন্ড ইন্টারসেকশন ফিল্টার
MongoDB Aggregation-এ একটি ফিল্ড (Id1) দিয়ে গ্রুপ করে, সেই গ্রুপে একাধিক নির্দিষ্ট ভ্যালু (Id2: 100 এবং 101) উভয়ই থাকা গ্রুপগুলো ফিল্টার করা যায়।
নমুনা সংগ্রহ তৈরি
> db.demo393.insertOne({ Id1: "1", Name: "Chris", Id2: "100" });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e804") }
> db.demo393.insertOne({ Id1: "1", Name: "Chris", Id2: "101" });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e805") }
> db.demo393.insertOne({ Id1: "3", Name: "Chris", Id2: "100" });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e806") }
> db.demo393.insertOne({ Id1: "3", Name: "Mike", Id2: "101" });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e807") }
সব ডকুমেন্ট দেখানো
> db.demo393.find();
আউটপুট:
Id1 দিয়ে গ্রুপ করে Id2: 100 এবং 101 উভয়ই থাকা গ্রুপ ফিল্টার
> db.demo393.aggregate([ { "$match": { "Name": "Chris" } }, { "$group": { "_id": "$Id1", "docs": { "$push": "$$ROOT" }, "count": { "$sum": 1 } }}, { "$match": { "count": { "$gt": 1 }, "docs": { "$all": [ { "$elemMatch": { "Id2": "100" } }, { "$elemMatch": { "Id2": "101" } } ] } }} ])ফলাফল (Id1="1" গ্রুপে 100 এবং 101 দুটোই আছে):
ব্যাখ্যা: প্রথমে Name="Chris" ফিল্টার, তারপর Id1 দিয়ে গ্রুপ। docs-এ পুরো ডকুমেন্ট পুশ। দ্বিতীয় $match-এ count>1 এবং docs অ্যারেতে $all দিয়ে উভয় Id2 (100 এবং 101) থাকা চেক করা হয়েছে। Id1="3" গ্রুপে শুধু 100 আছে, 101 নেই, তাই বাদ পড়েছে।