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 -> $limit2. المرحلة الأولى — $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
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- استخدم
$matchلفلترة المبيعات المكتملة فقط. - استخدم
$groupمع$sumلحساب المبيعات الكلية. - أضف
$avgلحساب المتوسط لكل قسم. - أضف
$sortللترتيب تنازلياً حسب المبيعات. - أضف
$limitلجلب أعلى قسمين فقط.
⏳ جارٍ تحميل المحرر التفاعلي...