MongoDB Aggregation-এ সর্ট এবং গ্রুপ একসাথে
একটি কোয়েরিতে ডেটা তারিখ অনুযায়ী সর্ট করে তারপর ইউজার অনুযায়ী গ্রুপ করার জন্য Aggregation Pipeline ব্যবহার করা হয়। এখানে প্রতিটি ইউজারের সর্বোচ্চ (latest) তারিখ বের করা হয়েছে।
নমুনা ডেটা তৈরি
> db.demo243.insertOne({"userId":1, dueDate: new ISODate("2019-01-10")});
> db.demo243.insertOne({"userId":2, dueDate: new ISODate("2019-11-10")});
> db.demo243.insertOne({"userId":2, dueDate: new ISODate("2020-01-31")});
> db.demo243.insertOne({"userId":1, dueDate: new ISODate("2010-01-10")});
সকল ডকুমেন্ট দেখানো
> db.demo243.find();
আউটপুট:
{ "_id" : ObjectId(...), "userId" : 1, "dueDate" : ISODate("2019-01-10") }
{ "_id" : ObjectId(...), "userId" : 2, "dueDate" : ISODate("2019-11-10") }
{ "_id" : ObjectId(...), "userId" : 2, "dueDate" : ISODate("2020-01-31") }
{ "_id" : ObjectId(...), "userId" : 1, "dueDate" : ISODate("2010-01-10") }
Aggregation Query
> db.demo243.aggregate([
{ $sort: { dueDate: -1 } },
{ $group: { _id: "$userId", dueDate: { $max: "$dueDate" } } }
]);
আউটপুট:
{ "_id" : 2, "dueDate" : ISODate("2020-01-31") }
{ "_id" : 1, "dueDate" : ISODate("2019-01-10") }
ব্যাখ্যা
- $sort: { dueDate: -1 } — ডেটা অবরোহ ক্রমে (সর্বশেষ তারিখ প্রথমে) সর্ট করে
- $group: userId অনুযায়ী গ্রুপ করে,
$maxদিয়ে সর্বোচ্চ তারিখ বের করে
মডার্ন বিকল্প: $first সাথে সর্ট
MongoDB 4.0+ এ আরও দক্ষ পদ্ধতি:
> db.demo243.aggregate([
{ $sort: { userId: 1, dueDate: -1 } },
{ $group: { _id: "$userId", latestDueDate: { $first: "$dueDate" } } }
]);
এটি $max-এর চেয়ে ফাস্ট কারণ সর্টেড ডেটা থেকে প্রথম মানই নেয়।
অতিরিক্ত ফিল্ড রাখতে চাইলে
> db.demo243.aggregate([
{ $sort: { dueDate: -1 } },
{ $group: {
_id: "$userId",
latestDueDate: { $max: "$dueDate" },
count: { $sum: 1 },
allDates: { $push: "$dueDate" }
}}
]);