MongoDB / المتوسط: التجميع وعقود التطبيق / الدرس 7
مراحل التجميع والتقارير المجمعة
حول الوثائق بمراحل صريحة واحفظ معنى الأعداد والمجاميع، وافصل الترشيح والتجميع والإسقاط والترتيب النهائي.
في هذه الصفحة
أهداف الدرس
- شرح مدخلات ومخرجات المراحل.
- التحقق من مستوى التجميع وأنواع الأرقام.
تغير كل مرحلة مجموعة الوثائق
تمر الوثائق بين المراحل؛ ترشح $match وتشكل $project وتغير $group المستوى وترتب $sort. لا تحفظ المرحلة بالضرورة صفاً لكل مدخل. حدد المستوى قبل الجمع والربط. معظم المسارات قراءة وتكتب $out و$merge، فلا يثبت اسم aggregate عدم الكتابة؛ راجع المسار كاملاً.
جمع مدخلاً اصطناعياً كاملاً
توفر $documents ثلاث دفعات دون مجموعة دائمة، وهي منذ 5.1 ونستخدمها بأساس 8.0. بعد الجمع للعميل 7 خمسة وعشرون وعدد اثنين ولـ8 خمسة وواحد. يجعل الفرز النتيجة حتمية، وهي مستنتجة لا منفذة. يرسل المشغل تجميع قاعدة صحيحاً للمرحلة بلا مجموعة.
db.getSiblingDB('quay_lab').aggregate([
{ $documents: [
{ customerId: 7, amount: 10 }, { customerId: 7, amount: 15 },
{ customerId: 8, amount: 5 }
] },
{ $group: { _id: '$customerId', total: { $sum: '$amount' }, count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
]);
{ _id: 7, total: 25, count: 2 }
{ _id: 8, total: 5, count: 1 }
مستوى الخرج وثيقة لكل عميل لا دفعة.
رشح المدخل والملخص في موضعين مختلفين
تختار $match قبل $group الأحداث المساهمة وبعدها الملخصات. لا تساوي دفعة فوق عشرين مجموع عميل فوقها. "$amount" مسار و"amount" سلسلة في سياق التعبير. تعتمد الدوال على النوع؛ قد تتجاهل $sum غير العددي فتخفي مبالغ نصية، فاحصر الأنواع بدلاً من الاتكال على التحويل.
وضح مجموعة المقياس الشرطية
يحوي المدخل مدفوعاً عشرة وعشرين ومعلقاً خمسة، فيعطي الترشيح مجموع ثلاثين وعدد اثنين. إذا لزم المقياسان معاً فاستخدم شروطاً أو $facet محدودة بدلالات منفصلة؛ لا تحذف المعلق ثم تحاول عده. عرف المرتجع والإلغاء والحالة الغائبة قبل المقياس المالي أو الخدمي.
db.getSiblingDB('quay_lab').aggregate([
{ $documents: [
{ state: 'paid', amount: 10 }, { state: 'paid', amount: 20 },
{ state: 'pending', amount: 5 }
] },
{ $match: { state: 'paid' } },
{ $group: { _id: null, total: { $sum: '$amount' }, count: { $sum: 1 } } }
]);
{ _id: null, total: 30, count: 2 }
للعينة مدخل مطابق؛ لا ينشئ المدخل الخالي عادة وثيقة ملخص صفرية تلقائياً.
قد يحتاج الخرج الصغير عملاً كبيراً
قد يعالج الجمع والفرز وثائق كثيرة لتقرير صغير. قد يتيح $match الانتقائي المبكر فهرسة، وافحص التحويلات بـ explain. تعتمد الذاكرة والتسرب على المرحلة والإصدار ولا تعني allowDiskUse ذاكرة مطلقة أو نموذجاً محدوداً. صالح يدوياً الخطأ والخلو والتكرار وأثبت المعنى قبل التحسين.
الأخطاء الشائعة وإصلاحها
يسقط المجموع نصاً يبدو عددياً
- لماذا يحدث؟
- لم تحقق المدخلات عقد العدد.
- كيف تصلحه؟
- احصر الأنواع وتحقق قبل المجاميع المرجعية.
- كيف تتجنب تكراره؟
- اختبر النوع الخاطئ لا الصحيح فقط.
يطبق حد الملخص قبل التجميع
- لماذا يحدث؟
- اختلط ترشيح الحدث باختيار الملخص.
- كيف تصلحه؟
- ضع شرط الملخص بعد $group.
- كيف تتجنب تكراره؟
- وثق مستوى كل مرحلة ومجموعتها.
يكتب مسار مفترض للقراءة بيانات
- لماذا يحدث؟
- أُغفلت $out أو $merge.
- كيف تصلحه؟
- افحص الكل واستخدم هدف كتابة معزولاً معتمداً.
- كيف تتجنب تكراره؟
- صنف المسار بمراحله لا اسمه.
اختبر فهمك
1. دفعتان 10 و15 للعميل 7. أين تضع شرط مجموع فوق20؟
اعرض الحل المشروح
جمع العميل والمبلغ ثم طبق $match على total فيبقى بخمسة وعشرين. يحذف الشرط قبل الجمع الدفعتين. احفظ العينة لأن دفعة كبيرة واحدة قد تخفي الفرق.
2. لا تطابق أحداث مدفوعة. هل يفترض التطبيق وثيقة مجموع صفري؟
اعرض الحل المشروح
لا؛ لا ينبعث تجميع عادة دون مدخل. حدد صفراً عرضياً أو غياب بيانات أو تنبيهاً، ولا تخلط الخلو بمبالغ خاطئة تجاهلتها الدالة. اختبر الحالتين منفصلتين.
أهم ما تعلمته
- لكل مرحلة عقد مستوى ومجموعة.
- تحقق من النوع والخلو قبل الثقة بالمجموع.