NahdaAIنهضة
NoSQL Databases • المستوى الثالث • الدرس 2

أساسيات خطوط التجميع (Aggregation Pipeline)

العودة لفهرس المستوى

أهداف الدرس

  • فهم طريقة عمل معالجة البيانات متعددة المراحل (Aggregation Pipeline).
  • استخراج تقارير إحصائية بـ $match و $group.
  • استخدام Accumulators: $sum، $avg، $max، $min.
  • دمج المراحل بالتسلسل: $match → $group → $sort → $limit.

1. ما هو Aggregation Pipeline؟

هو عبارة عن سلسلة من المراحل المتتالية، تمرّ البيانات عبر كل مرحلة لتُنتج تقارير تحليلية معقدة — يشبه خط الإنتاج في مصنع.

javascript
db.sales.aggregate([
  { $match:   { status: "completed" } },     // 1. فلترة
  { $group:   { _id: "$category",            // 2. تجميع
                total: { $sum: "$amount" } } },
  { $sort:    { total: -1 } },               // 3. ترتيب
  { $limit:   3 }                            // 4. أعلى 3
]);

// خط الأنابيب:
// [كل البيانات] -> $match -> [مكتملة] -> $group -> [مجاميع] -> $sort -> $limit

2. المرحلة الأولى — $match (الفلترة)

$match يفلتر المستندات مثل find() تماماً — الفرق أنه مرحلة في pipeline.

javascript
// فلترة بسيطة
db.sales.aggregate([
  { $match: { status: "completed" } }
]);

// فلترة معقدة بمعاملات
db.sales.aggregate([
  {
    $match: {
      status: "completed",
      amount: { $gte: 500 }
    }
  }
]);

// نصيحة: ضع $match في البداية دائماً
// لتقليل حجم البيانات قبل المراحل الثقيلة

3. المرحلة الثانية — $group (التجميع)

$group يجمع المستندات حسب مفتاح معيّن (_id) ويطبّق Accumulators.

$sum — المجموع
{ $sum: "$amount" }
// مجموع القيم
$avg — المتوسط
{ $avg: "$amount" }
// المتوسط الحسابي
$max — الأقصى
{ $max: "$amount" }
// أعلى قيمة
$min — الأدنى
{ $min: "$amount" }
// أدنى قيمة
javascript
db.sales.aggregate([
  {
    $group: {
      _id: "$category",              // <- مفتاح التجميع
      totalSales: { $sum: "$amount" },
      avgSales:   { $avg: "$amount" },
      maxSale:    { $max: "$amount" },
      count:      { $sum: 1 }        // <- عدد المستندات
    }
  }
]);

// النتيجة:
// [
//   { _id: "electronics", totalSales: 5450, avgSales: 1362.5, ... },
//   { _id: "clothing",    totalSales: 1020, avgSales: 340,    ... },
//   ...
// ]

4. دمج المراحل + $project

$project يُعيد تشكيل النتائج النهائية (مثل Projection).

javascript
db.sales.aggregate([
  { $match: { status: "completed" } },
  {
    $group: {
      _id: "$category",
      totalSales: { $sum: "$amount" },
      count: { $sum: 1 }
    }
  },
  {
    $project: {
      _id: 0,
      category: "$_id",        // <- إعادة تسمية _id
      totalSales: 1,
      count: 1
    }
  },
  { $sort: { totalSales: -1 } }
]);

// النتيجة نظيفة:
// [
//   { category: "electronics", totalSales: 5450, count: 4 },
//   { category: "clothing",    totalSales: 1020, count: 3 },
//   { category: "books",       totalSales: 90,   count: 1 }
// ]
التطبيق العملي المباشر

تحدي الدرس الثاني: Aggregation Pipeline

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. استخدم $match لفلترة المبيعات المكتملة فقط.
  2. استخدم $group مع $sum لحساب المبيعات الكلية.
  3. أضف $avg لحساب المتوسط لكل قسم.
  4. أضف $sort للترتيب تنازلياً حسب المبيعات.
  5. أضف $limit لجلب أعلى قسمين فقط.
⏳ جارٍ تحميل المحرر التفاعلي...