$match, $group, আর $project-এর বাইরে, মুষ্টিমেয় অন্য stage বাকি বেশিরভাগ real-world aggregation প্রয়োজন cover করে।
Pipeline stage হিসেবে, ঠিক তাদের find() সমতুল্যদের মতো কাজ করে — সাধারণত একটা গণনা করা result order আর সীমাবদ্ধ করতে $group-এর পরে রাখা হয়:
db.orders.aggregate([
{ $group: { _id: "$customerId", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } },
{ $limit: 5 }
])
// Total খরচ অনুযায়ী top ৫ customer$unwind একটা array field সহ একটা document নেয় আর array element প্রতি একটা document output করে — সেই array-এর ভিতরে individual item দিয়ে $group করার আগে দরকার:
// tags: ["sale", "featured"] সহ একটা document
// $unwind-এর পরে দুটো document হয়ে যায়, প্রতি tag একটা
db.products.aggregate([
{ $unwind: "$tags" },
{ $group: { _id: "$tags", count: { $sum: 1 } } }
])$lookup হলো একটা SQL JOIN-এর MongoDB সমতুল্য — এটা একটা shared field-এর ভিত্তিতে একটা ভিন্ন collection থেকে matching document টেনে আনে:
db.posts.aggregate([
{
$lookup: {
from: "authors",
localField: "authorId",
foreignField: "_id",
as: "authorInfo"
}
}
])Result প্রতিটা post-এ একটা authorInfo array field যোগ করে, matching author document(গুলো) ধারণ করে — এটাই ঠিক সেই operation যা schema-design lesson-এর referencing pattern সমর্থন করার জন্য তৈরি।
Logic যত তাড়াতাড়ি অনুমতি দেয় $match রাখুন
Stage order শুধু style না, correctness-এর জন্যও গুরুত্বপূর্ণ — $group-এর আগে $match input filter করে; $group-এর পরে $match গণনা করা result filter করে। যত তাড়াতাড়ি logic অনুমতি দেয় pipeline-এ filter রাখাও standard performance অভ্যাস।