إذا كان MapReduce هو خيارك المفضل، فقد يكون الآن هو الوقت المناسب للانتقال إلى خط أنابيب التجميع الخاص بـ MongoDB لمعالجة العمليات المعقدة.

يعد خط أنابيب التجميع الطريقة الموصى بها لتشغيل الاستعلامات المعقدة في MongoDB. إذا كنت تستخدم MapReduce الخاص بـ MongoDB، فمن الأفضل أن تنتقل إلى مسار التجميع لإجراء عمليات حسابية أكثر كفاءة.

ما هو التجميع في MongoDB وكيف يعمل؟

يعد خط أنابيب التجميع عملية متعددة المراحل لتشغيل البرامج المتقدمة الاستعلامات في MongoDB. يقوم بمعالجة البيانات من خلال مراحل مختلفة تسمى خط الأنابيب. يمكنك استخدام النتائج الناتجة من أحد المستويات كقالب عملية في مستوى آخر.

على سبيل المثال، يمكنك تمرير نتيجة عملية المطابقة إلى مرحلة أخرى للفرز بهذا الترتيب حتى تحصل على المخرجات المطلوبة.

تتميز كل مرحلة من مراحل خط أنابيب التجميع بمشغل MongoDB وتقوم بإنشاء مستند واحد أو أكثر من المستندات المحولة. اعتمادًا على الاستعلام الخاص بك، يمكن أن يظهر المستوى عدة مرات في المسار. على سبيل المثال، قد تحتاج إلى استخدام عدد $ أو $نوع مراحل المشغل أكثر من مرة عبر خط أنابيب التجميع.

مراحل خط أنابيب التجميع

instagram viewer

يمرر خط أنابيب التجميع البيانات عبر مراحل متعددة في استعلام واحد. هناك عدة مراحل ويمكنك العثور على تفاصيلها في وثائق MongoDB.

دعنا نحدد بعضًا من أكثرها شيوعًا أدناه.

مرحلة المباراة $

تساعدك هذه المرحلة على تحديد شروط تصفية معينة قبل البدء في مراحل التجميع الأخرى. يمكنك استخدامه لتحديد البيانات المطابقة التي تريد تضمينها في مسار التجميع.

مرحلة المجموعة $

تقوم مرحلة المجموعة بفصل البيانات إلى مجموعات مختلفة بناءً على معايير محددة باستخدام أزواج القيمة الرئيسية. تمثل كل مجموعة مفتاحًا في مستند الإخراج.

على سبيل المثال، النظر في ما يلي مبيعات بيانات العينة:

باستخدام مسار التجميع، يمكنك حساب إجمالي عدد المبيعات وأعلى المبيعات لكل قسم من أقسام المنتج:

{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}

ال _id: القسم $ يقوم الزوج بتجميع مستند الإخراج بناءً على الأقسام. وذلك بتحديد top_sales_count و top_sales الحقول، يقوم MongoDB بإنشاء مفاتيح جديدة بناءً على العملية المحددة بواسطة المجمع؛ هذا يمكن أن يكون مبلغ $, $دقيقة, $ماكس، أو متوسط ​​$.

مرحلة تخطي $

يمكنك استخدام ال $تخطي مرحلة حذف عدد محدد من المستندات في الإخراج. وعادة ما يأتي بعد مرحلة المجموعات. على سبيل المثال، إذا كنت تتوقع مستندين مخرجين ولكنك تخطيت أحدهما، فسيقوم التجميع بإخراج المستند الثاني فقط.

لإضافة مرحلة تخطي، أدخل $تخطي العملية في خط أنابيب التجميع:

...,
{
$skip: 1
},

مرحلة الفرز $

تتيح لك مرحلة الفرز ترتيب البيانات بترتيب تنازلي أو تصاعدي. على سبيل المثال، يمكننا فرز البيانات في مثال الاستعلام السابق بترتيب تنازلي لتحديد القسم الذي لديه أعلى المبيعات.

أضف ال $نوع العامل للاستعلام السابق:

...,
{
$sort: {top_sales: -1}
},

مرحلة الحد $

تساعد عملية الحد على تقليل عدد مستندات الإخراج التي تريد أن يظهرها مسار التجميع. على سبيل المثال، استخدم حد $ ليحصل المشغل على القسم ذو أعلى المبيعات المرتجعة حسب المرحلة السابقة:

...,
{
$sort: {top_sales: -1}
},

{"$limit": 1}

ما ورد أعلاه يُرجع المستند الأول فقط؛ هذا هو القسم ذو أعلى المبيعات، كما يظهر في أعلى المخرجات التي تم فرزها.

مرحلة المشروع $

ال مشروع $ تتيح لك المرحلة تشكيل مستند الإخراج كما تريد. باستخدام مشروع $ عامل التشغيل، يمكنك تحديد الحقل الذي سيتم تضمينه في الإخراج وتخصيص اسمه الرئيسي.

على سبيل المثال، إخراج عينة دون مشروع $ المرحلة تبدو هكذا:

دعونا نرى كيف يبدو مع مشروع $ منصة. لإضافة مشروع $ إلى خط الأنابيب:

...,

{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",

}
}

نظرًا لأننا قمنا مسبقًا بتجميع البيانات بناءً على أقسام المنتج، فإن ما ورد أعلاه يتضمن كل قسم منتج في مستند الإخراج. كما يضمن أيضًا أن يكون عدد المبيعات المجمعة وميزة أعلى المبيعات في الإخراج كـ إجمالي المبيعات و توب سيل.

الناتج النهائي أنظف بكثير مقارنة بالإخراج السابق:

مرحلة الاسترخاء $

ال $استرخاء تقوم المرحلة بتقسيم المصفوفة داخل المستند إلى مستندات فردية. خذ ما يلي طلبات البيانات، على سبيل المثال:

استخدم ال $استرخاء مرحلة تفكيك أغراض المصفوفة قبل تطبيق مراحل التجميع الأخرى. على سبيل المثال، تفكيك أغراض يعد المصفوفة منطقية إذا كنت تريد حساب إجمالي الإيرادات لكل منتج:

db.Orders.aggregate(
[
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.product",
"total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
}
},
{
"$sort": { "total_revenue": -1 }
},

{
"$project": {
"_id": 0,
"Product": "$_id",
"TotalRevenue": "$total_revenue",

}
}
])

إليك نتيجة استعلام التجميع أعلاه:

كيفية إنشاء خط أنابيب التجميع في MongoDB

على الرغم من أن مسار التجميع يتضمن العديد من العمليات، فإن المراحل المميزة مسبقًا تمنحك فكرة عن كيفية تطبيقها في المسار، بما في ذلك الاستعلام الأساسي لكل منها.

باستخدام السابق مبيعات عينة من البيانات، فلنتناول بعض المراحل التي تمت مناقشتها أعلاه في قطعة واحدة للحصول على رؤية أوسع لمسار التجميع:

db.sales.aggregate([

{
"$match": {
"Sold": { "$gte": 5 }
}
},

{

"$group": {
"_id": "$Section",
"total_sales_count": { "$sum": "$Sold" },
"top_sales": { "$max": "$Amount" },

}

},

{
"$sort": { "top_sales": -1 }
},

{"$skip": 0},

{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",

}
}

])

يبدو الناتج النهائي كشيء رأيته سابقًا:

خط أنابيب التجميع مقابل. MapReduce

حتى إهمالها بدءًا من MongoDB 5.0، كانت الطريقة التقليدية لتجميع البيانات في MongoDB عبر MapReduce. بالرغم من لدى MapReduce تطبيقات أوسع بخلاف MongoDB، فهو أقل كفاءة من خط أنابيب التجميع، ويتطلب برمجة نصية من جهة خارجية لكتابة الخريطة وتقليل الوظائف بشكل منفصل.

من ناحية أخرى، فإن خط أنابيب التجميع خاص بـ MongoDB فقط. ولكنه يوفر طريقة أنظف وأكثر كفاءة لتنفيذ الاستعلامات المعقدة. إلى جانب البساطة وقابلية التوسع للاستعلام، فإن مراحل المسار المميزة تجعل المخرجات أكثر قابلية للتخصيص.

هناك أكثر من ذلك بكثير الاختلافات بين خط أنابيب التجميع وMapReduce. ستراها أثناء التبديل من MapReduce إلى مسار التجميع.

جعل استعلامات البيانات الكبيرة فعالة في MongoDB

يجب أن يكون استعلامك فعالاً قدر الإمكان إذا كنت تريد إجراء حسابات متعمقة على البيانات المعقدة في MongoDB. يعد خط أنابيب التجميع مثاليًا للاستعلام المتقدم. بدلاً من معالجة البيانات في عمليات منفصلة، ​​الأمر الذي يؤدي غالبًا إلى تقليل الأداء، يتيح لك التجميع تجميعها جميعًا داخل مسار أداء واحد وتنفيذها مرة واحدة.

على الرغم من أن مسار التجميع أكثر كفاءة من MapReduce، إلا أنه يمكنك جعل التجميع أسرع وأكثر كفاءة من خلال فهرسة بياناتك. وهذا يحد من كمية البيانات التي يحتاج MongoDB إلى فحصها أثناء كل مرحلة تجميع.