DATABASE ARCHITECTURE

MongoDB Aggregation

Definition: Aggregation operations process data records and return computed results. It groups values from multiple documents together, and can perform a variety of operations to return a single result.

ডেটাবেস থেকে শুধু ডেটা ফেচ করা নয়, বরং ডেটাকে ফিল্টার, গ্রুপ এবং এনালাইজ করে রিপোর্ট তৈরি করার জন্য MongoDB-এর সবচেয়ে শক্তিশালী টুল হলো Aggregation Pipeline।

1. Node.js Memory vs DB Processing

The Out of Memory (OOM) Trap

ধরি, আমাদের ই-কমার্স অ্যাপে গত ৩০ দিনে ৫,০০,০০০টি অর্ডার পড়েছে। এখন আমাদের ম্যানেজমেন্ট একটি রিপোর্ট চাইল: "গত মাসের টোটাল সেলস ক্যাটাগরি অনুযায়ী হিসাব করে দাও।"

ভুল পদ্ধতি (Application Level): আপনি যদি find() দিয়ে ৫ লাখ অর্ডার Node.js সার্ভারে নিয়ে আসেন এবং জাভাস্ক্রিপ্ট লুপ চালিয়ে সাম (Sum) করতে যান, তবে সার্ভারের RAM ফুল হয়ে অ্যাপ্লিকেশন ক্র্যাশ করবে (OOM Error)।
প্রো পদ্ধতি (Database Level): আমরা MongoDB Aggregation ব্যবহার করব। এতে পুরো প্রসেসিংটা সরাসরি ডাটাবেস ইঞ্জিনের (C++) ভেতরে হবে এবং ডাটাবেস শুধু একটি ছোট ফলাফল (যেমন: ৫টি ক্যাটাগরির টোটাল রেভিনিউ) নেটওয়ার্ক দিয়ে Node.js এ পাঠাবে। নেটওয়ার্ক ব্যান্ডউইথ ও সার্ভার মেমোরি দুটোই বেঁচে যাবে!

Application Level (Bad)

১০০ মেগাবাইট ডেটা নেটওয়ার্ক দিয়ে ফেচ করা -> Node.js CPU ও RAM ব্যবহার করে লুপ চালানো -> অত্যন্ত স্লো এবং ক্র্যাশ করার ঝুঁকি থাকে।

Database Level (Pro)

ডাটাবেস ইঞ্জিন তার অপ্টিমাইজড ইনডেক্স ব্যবহার করে হিসাব করে -> মাত্র ১ কিলোবাইট রেজাল্ট রিটার্ন করে। ব্লেজিং ফাস্ট!

2. The Core Pipeline Stages

Aggregation Pipeline অনেকটা কারখানার একটি এসেম্বলি লাইনের মতো কাজ করে। ডকুমেন্টসগুলো এক স্টেপ থেকে অন্য স্টেপে পাস হয় এবং ধাপে ধাপে রূপান্তরিত হয়:

$match ডটকমেন্ট ফিল্টার করে (SQL-এর WHERE ক্লাজের মতো)। পাইপলাইনের প্রথমে এটি ব্যবহার করলে ডেটার সাইজ অনেক কমে যায়।

$group নির্দিষ্ট কোনো কী (Key) অনুযায়ী ডেটা গ্রুপ করে এবং বিভিন্ন ম্যাট্রিক্স (Sum, Avg, Min, Max) হিসাব করে।

$sort প্রসেসড ডেটাগুলোকে সাজায় (1 মানে Ascending, -1 মানে Descending)।

$project ফাইনাল আউটপুটের শেপ পরিবর্তন করে (দরকারী ফিল্ড রাখা এবং অপ্রয়োজনীয় ফিল্ড লুকিয়ে ফেলা)।

3. Complex Analytics Query (Mongoose)

নিচে একটি ইন্ডাস্ট্রি-স্ট্যান্ডার্ড কোড দেওয়া হলো, যার মাধ্যমে আমরা শেষ ৩০ দিনের সেরা ৫টি সেরা সেলিং ক্যাটাগরি বের করে আনি:

controllers/analyticsController.js
const Order = require('../models/Order');

exports.getTopCategories = async (req, res) => {
    const pipeline = [
        // 1. Filter completed orders from the last 30 days
        { $match: { 
            status: 'completed',
            createdAt: { $gte: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) } 
        }},
        // 2. Group by category and calculate total revenue & units sold
        { $group: { 
            _id: '$category', 
            totalRevenue: { $sum: '$price' },
            unitsSold: { $sum: 1 }
        }},
        // 3. Sort by total revenue (Descending)
        { $sort: { totalRevenue: -1 } },
        // 4. Limit to top 5 categories
        { $limit: 5 }
    ];

    const report = await Order.aggregate(pipeline);
    res.json(report);
};

4. Live Pipeline Builder Simulator

নিচে পাইপলাইন স্টেজগুলো একটার পর একটা অন করুন। দেখুন কীভাবে কাঁচা কালেকশন ডেটা (Raw Collection) স্টেপে স্টেপে ফিল্টার হয়ে একটি সুন্দর বিজনেস রিপোর্টে পরিণত হয়।

Pipeline Stages:

1. $match status: "completed"
2. $group _id: "$category", total: { $sum }
3. $sort totalRevenue: -1 (DESC)