MongoDB / المتوسط: التجميع وعقود التطبيق / الدرس 8
$lookup و$unwind وتعددية التقرير
اربط المجموعات دون فقد الأصل الاختياري أو تضخيم المجاميع، واشرح مصفوفات المطابقة وتوسيعها وربطها المحدود.
في هذه الصفحة
أهداف الدرس
- توقع مصفوفة الربط وعدد التوسيع.
- اختيار الوجود أو التفاصيل أو الملخص المسبق.
تنشئ مرحلة الربط مصفوفة مطابقات
تضيف $lookup مصفوفة أجنبية لكل وثيقة بأسلوب خارجي أيسر، ولا تضمن مطابقاً واحداً. قد تتعدد إن لم يكن المفتاح فريداً. اختبر الغياب وnull للمفاتيح الاختيارية. تتغير البنية إلى مصفوفة لا كائن مفرد، وقد يستلزم الربط المتكرر لفروع غير محدودة إعادة النموذج أو الملخص.
حدد عينة مرجعية واضحة
افترض العميل7 Lina والحجز101 بمرجعه. يضاف عنصر واحد ويفرغ الصف غير المطابق. يسقط المسار المعرف وأسماء العملاء موضحاً المصفوفة، ويحتاج العينة ولم ينفذ. ادرس فهرس المفتاح الأجنبي ولا تدع استراتيجية تنفيذ من حجم العينة.
db.getSiblingDB('quay_lab').bookings.aggregate([
{ $match: { _id: 101 } },
{ $lookup: { from: 'customers', localField: 'customerId', foreignField: '_id', as: 'customer' } },
{ $project: { _id: 1, 'customer.name': 1 } }
]);
{ _id: 101, customer: [ { name: "Lina" } ] }
النتيجة مصفوفة مطابقات ولا تسطح تلقائياً.
يغير التوسيع مستوى التقرير
تنتج $unwind وثيقة لكل عنصر وتكرر الأصل. لا تحفظ الغائب وnull والفارغ افتراضياً كالتفاصيل، ويمكن preserveNullAndEmptyArrays حفظه. يصبح بندان وثيقتين وقد تولد ثلاث دفعات موسعة ست تركيبات. تتكرر قيمة الأصل فحدد مستوى المقياس والملخص المستقل قبل الجمع.
احفظ الأصل الخالي عمداً
للحجز1 كميتان ولـ2 مصفوفة فارغة. مع الحفظ تخرج ثلاث وثائق: اثنتان للبنود وواحدة للأصل بلا كمية. يعد عد كل الخرج واحداً للخالي لا صفر فروع. هذا فرق عد الصف الخارجي المحفوظ ويجب أن يظهر بالتحقق.
db.getSiblingDB('quay_lab').aggregate([
{ $documents: [ { _id: 1, lines: [{ qty: 2 }, { qty: 3 }] }, { _id: 2, lines: [] } ] },
{ $unwind: { path: '$lines', preserveNullAndEmptyArrays: true } },
{ $project: { _id: 1, qty: '$lines.qty' } },
{ $sort: { _id: 1, qty: 1 } }
]);
{ _id: 1, qty: 2 }
{ _id: 1, qty: 3 }
{ _id: 2 }
تحفظ الأخيرة الأصل دون اختلاق كمية فرع صفرية.
حد عمل الطرف الآخر واحفظ نطاق الوصول
تتيح صيغة المسار مطابقة وإسقاطاً أدق ومتغيرات let وفق القواعد. تعتمد الفهرسة على المقارنة والإصدار فافحص explain. أضف نطاق المستأجر للطرفين عند اللزوم. دعمت 5.1 مجموعة from مجزأة ولا يجعل ذلك الربط رخيصاً. اختر الوجود أو الملخص إذا لم تلزم كل التفاصيل.
الأخطاء الشائعة وإصلاحها
تتضاعف المجاميع بعد توسيعين
- لماذا يحدث؟
- شكل فرعان مستقلان حاصل ضرب.
- كيف تصلحه؟
- جمع مقياس كل فرع عند الأصل أولاً.
- كيف تتجنب تكراره؟
- توقع العدد بعينة اثنين في ثلاثة.
تختفي الأصول بلا فروع
- لماذا يحدث؟
- أسقط التوسيع الافتراضي الفارغ والغائب.
- كيف تصلحه؟
- استخدم الحفظ عندما يطلب التقرير.
- كيف تتجنب تكراره؟
- اختبر الفارغ والغائب وnull والممتلئ.
يعامل التطبيق خرج الربط ككائن واحد
- لماذا يحدث؟
- أُغفل عقد المصفوفة.
- كيف تصلحه؟
- عالج الصفر والواحد والمتعدد.
- كيف تتجنب تكراره؟
- افرض التفرد حيث يلزم مطابق واحد.
اختبر فهمك
1. للحجز بندان وثلاث دفعات. ما عدد التوسيعين ولماذا يخطر الجمع؟
اعرض الحل المشروح
قد تنتج ستة؛ يتكرر البند ثلاثاً والدفع مرتين. لخص كل مقياس مستقلاً لكل حجز قبل الجمع أو احفظ تفاصيل بلا جمع المتكرر. لا تصلح DISTINCT للمبالغ لأن تساويها قد يكون صحيحاً.
2. لا يجد الربط عميلاً ثم يوسع customer بلا خيارات. هل يبقى الحجز؟
اعرض الحل المشروح
ينشئ الربط مصفوفة فارغة ويسقطها التوسيع. فعل الحفظ إذا لزم وحدد العرض؛ وإذا كان العميل إلزامياً فحقق في التكامل لا إخفائه. يقرر العقد لا الاسم وحده.
أهم ما تعلمته
- تحدد مصفوفة الربط وتعددية التوسيع معنى التقرير.
- الحفظ والتلخيص المسبق خيارا صحة مقصودان.