MongoDB-এ এগ্রিগেশন পাইপলাইনে $group এবং $sort স্টেজ ব্যবহার করে একই ক্যোয়ারিতে গ্রুপিং এবং সর্টিং করা যায়।
উদাহরণ
প্রোডাক্ট এবং প্রাইস সহ ডকুমেন্ট তৈরি করুন:
> db.sortAndGroupDemo.insertOne({ Price: 40, Product: 10 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e907") }
> db.sortAndGroupDemo.insertOne({ Price: 100, Product: 10 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e908") }
> db.sortAndGroupDemo.insertOne({ Price: 90, Product: 20 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e909") }
> db.sortAndGroupDemo.insertOne({ Price: 200, Product: 10 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e90a") }
> db.sortAndGroupDemo.insertOne({ Price: 70, Product: 20 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bc78f00858fb12e90b") }
> db.sortAndGroupDemo.insertOne({ Price: 70, Product: 30 });
{ "acknowledged" : true, "insertedId" : ObjectId("5ce8f2bd78f00858fb12e90c") }
সকল ডকুমেন্ট দেখুন:
> db.sortAndGroupDemo.find().pretty();
আউটপুট:
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e907"), "Price" : 40, "Product" : 10 }
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e908"), "Price" : 100, "Product" : 10 }
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e909"), "Price" : 90, "Product" : 20 }
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e90a"), "Price" : 200, "Product" : 10 }
{ "_id" : ObjectId("5ce8f2bc78f00858fb12e90b"), "Price" : 70, "Product" : 20 }
{ "_id" : ObjectId("5ce8f2bd78f00858fb12e90c"), "Price" : 70, "Product" : 30 }
Product ভিত্তিক গ্রুপ করে Price অনুযায়ী সর্ট করা
> db.sortAndGroupDemo.aggregate([
{ "$group": { "_id": "$Product" } },
{ "$sort": { "Price": 1 } },
{ "$project": { "_id": 1 } }
]);
আউটপুট:
{ "_id" : 30 }
{ "_id" : 20 }
{ "_id" : 10 }
গুরুত্বপূর্ণ সমস্যা: উপরের ক্যোয়ারিতে $sort ঠিকমতো কাজ করে না, কারণ $group এর পর Price ফিল্ড আর থাকে না (শুধু _id থাকে)। MongoDB এরর না দিয়ে সর্ট নয় করে।
সঠিক পদ্ধতি: গ্রুপের মধ্যে সর্ট বা অ্যাগ্রিগেটড ফিল্ডে সর্ট
পদ্ধতি ১: গ্রুপের মধ্যে মিন/ম্যাক্স প্রাইস রাখে সর্ট
db.sortAndGroupDemo.aggregate([
{ $group: { _id: "$Product", minPrice: { $min: "$Price" } } },
{ $sort: { minPrice: 1 } },
{ $project: { _id: 1 } }
]);
আউটপুট:
{ "_id" : 30, "minPrice" : 70 }
{ "_id" : 20, "minPrice" : 70 }
{ "_id" : 10, "minPrice" : 40 }
পদ্ধতি ২: সব প্রাইস অ্যারে আকারে রাখে সর্ট
db.sortAndGroupDemo.aggregate([
{ $group: { _id: "$Product", prices: { $push: "$Price" } } },
{ $sort: { "prices.0": 1 } }, // প্রথম এলিমেন্টে সর্ট (সেট করলে)
{ $project: { _id: 1 } }
]);
সুপারিশ: গ্রুপ করার সময় সর্টিংয়ের জন্য প্রয়োজনীয় ফিল্ড (min, max, avg) কম্পিউট করে রাখুন, তারপর সর্ট করুন।