Aggregation-এ $setIsSubset ব্যবহার করে রোল-ভিত্তিক ফিল্ড ফিল্টার
MongoDB Aggregation-এ একাধিক রোল (Admin, Guest, User) থাকার পরিস্থিতিতে নির্দিষ্ট রোল (যেমন Admin) না থাকা ইউজারদের Name ফিল্ড বের করতে $setIsSubset ব্যবহার করা হয়।
নমুনা সংগ্রহ তৈরি (৩টি রোল)
> db.demo532.insertOne({"Name":"Chris","Type":"Admin"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b4a9def4dcbee04fbbbf9") }
> db.demo532.insertOne({"Name":"David","Type":"Guest"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b4aa3ef4dcbee04fbbbfa") }
> db.demo532.insertOne({"Name":"Bob","Type":"User"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b4ab0ef4dcbee04fbbbfb") }
সব ডকুমেন্ট দেখানো
> db.demo532.find();
আউটপুট:
Admin রোল না থাকা ইউজারদের Name বের করা (জটিল অগ্রেশন)
> db.demo532.aggregate([ {$group: {_id:"$Name", "types":{$addToSet:"$Type"}}}, {$project: {_id:1, "types": 1, "isSubset": { $setIsSubset: [ ["Admin"], "$types" ] }}}, {$match: {"isSubset": false}}, {$group: {_id:"$isSubset", "Name": {$push : "$_id"}}}, {$project: {"_id": 0, "Name": 1}}, {$unwind: "$Name"} ])ফলাফল (Admin না থাকা David এবং Bob):
ব্যাখ্যা: ১) Name দিয়ে গ্রুপ করে types অ্যারে তৈরি (Chris-এ Admin, David-এ Guest, Bob-এ User)। ২) $setIsSubset: [["Admin"], "$types"] দিয়ে চেক করা হয়েছে ["Admin"] সেটটি types-এ সাবসেট কিনা। Chris-এ true, বাকিদের false। ৩) false वालাগুলো ফিল্টার করে Name বের করা হয়েছে।