সাধারণ এলিমেন্ট পেয়ে লিস্ট মylated করা
MongoDB-এ একাধিক ডকুমেন্টের অ্যারে ফিল্ড থেকে কমপক্ষে একটি সাধারণ এলিমেন্ট থাকলে তাদের আইডি একসাথে গ্রুপ করতে জটিল অ্যাগ্রিগেশন পাইপলাইন ব্যবহার করা হয়।
নমুনা ডেটা তৈরি
> db.demo456.insertOne({ _id: 101, StudentName: ["Chris", "David"] })
> db.demo456.insertOne({ _id: 102, StudentName: ["Mike", "Sam"] })
> db.demo456.insertOne({ _id: 103, StudentName: ["John", "Jace"] })
> db.demo456.insertOne({ _id: 104, StudentName: ["Robert", "John"] })
সমস্ত ডকুমেন্ট দেখানো
> db.demo456.find()
আউটপুট:
{ "_id": 101, "StudentName": ["Chris", "David"] }
{ "_id": 102, "StudentName": ["Mike", "Sam"] }
{ "_id": 103, "StudentName": ["John", "Jace"] }
{ "_id": 104, "StudentName": ["Robert", "John"] }
সাধারণ এলিমেন্ট পেয়ে গ্রুপ করার জটিল কোয়েরি
> db.demo456.aggregate([
{ $unwind: "$StudentName" },
{ $group: { _id: "$StudentName", combine: { $addToSet: "$_id" }, size: { $sum: 1 } } },
{ $match: { size: { $gt: 1 } } },
{ $project: { _id: 1, combine: 1, size: 1, combine1: "$combine" }},
{ $unwind: "$combine" },
{ $unwind: "$combine1" },
{ $group: { _id: "$combine", l: { $first: "$_id" }, size: { $sum: 1 }, set: { $addToSet: "$combine1" }}},
{ $sort: { size: 1 }},
{ $group: { _id: "$l", combineIds: { $last: "$set" }, size: { $sum: 1 }}},
{ $match: { size: { $gt: 1 }}}
])
ফলাফল:
{ "_id": "John", "combineIds": [103, 104], "size": 2 }
ব্যাখ্যা
$unwind: StudentName অ্যারে বিচ্ছিন্ন করে- প্রথম $group: প্রতিটি নামের জন্য কোন ডকুমেন্টগুলো আছে (combine) এবং কয়টি (size)
$match size > 1: শুধু যেসব নাম একাধিক ডকুমেন্টে আছে তাদের রাখে- বাকি স্টেপগুলো: সেই সাধারণ নাম শেয়ার করা ডকুমেন্ট পেয়ারগুলো খুঁজে বের করে এবং ফাইনাল গ্রুপ তৈরি করে
ফলাফল: "John" নামটি ১০৩ এবং ১০৪ নম্বর ডকুমেন্টে আছে, তাই সেটি ফলাফলে আসেছে।
সতর্কতা: এটি শিক্ষামূলক উদাহরণ। বাস্তব অ্যাপে গ্রাফ অ্যালগরিদম বা অ্যাপ্লিকেশন লেভেলে করা ভালো।