MongoDB / الأساسي: أسس الوثائق / الدرس 5
استعلام المصفوفات والوثائق المضمنة
طابق عنصر المصفوفة المقصود واحفظ نطاق التحديث، وميز عناصر المطابقة المنفصلة والتحديث الموضعي وتوسيع التقرير.
في هذه الصفحة
أهداف الدرس
- استخدام $elemMatch لشروط العنصر الواحد.
- شرح إسقاط المصفوفة والتحديث الموضعي المرشح.
قد تطابق الشروط عناصر مختلفة
تحوي lines أزواج صنف وكمية. قد يطابق شرطا lines.sku وlines.qty عنصرين مختلفين دون $elemMatch. إذا لزم بند PEN واحد بكمية خمس فأكثر فاجمعهما داخله. هذه صحة قبل الفهرسة. اختبر عنصراً يطابق الصنف وآخر يطابق الكمية لإظهار الفرق.
اشترط بنداً واحداً مؤهلاً
افترض الحجز 1 ببند PEN اثنين وPAD عشرة والحجز 2 ببند PEN ستة. يعاد 2 فقط لأن العنصر يحقق الشرطين. لا تعني مطابقة المصفوفة إرجاع المطابق وحده؛ الإسقاط هنا المعرف. لترشيح العناصر اختر إسقاطاً أو تجميعاً وحدد أول مطابق أم الجميع.
db.getSiblingDB('quay_lab').bookings.find(
{ lines: { $elemMatch: { sku: 'PEN', qty: { $gte: 5 } } } },
{ _id: 1 }
);
{ _id: 2 }
تعتمد النتيجة على الحجزين المذكورين ولا تكفي عناصر منفصلة لـ $elemMatch.
تختلف مطابقة المسار عن مساواة الوثيقة كلها
يسأل destination.city عن حقل داخلي. تتطلب مساواة الوثيقة المضمنة الحرفية البنية وترتيب الحقول وفق الدلالة، وقد تكون أضيق من السؤال. استخدم المسار للحقيقة المفردة. تختلف معاملات مصفوفات القيم والوثائق، ولا تعامل كل أقواس كـ SQL IN أو مساواة المصفوفة كعضوية بلا ترتيب.
قيد الوثيقة والعنصر المعدل معاً
يحدث المعرف line كل عناصر PEN داخل الحجز 101. يحدد المرشح الخارجي الوثيقة وarrayFilters العناصر وهما نطاقان. تحفظ $inc الحساب بدل رصيد قديم من التطبيق. امنع تكرار SKU منفصلاً إن لزم؛ يغير المثال كل المطابقات عمداً. لم ينفذ التغيير ولا تلزم معاملة لتعدد حقول الوثيقة وحده.
db.getSiblingDB('quay_lab').bookings.updateOne(
{ _id: 101 },
{ $inc: { 'lines.$[line].qty': 1 } },
{ arrayFilters: [{ 'line.sku': 'PEN' }] }
);
مع بند PEN واحد بكمية 2 تصبح 3، وتزداد كل البنود المطابقة إذا تعددت.
تؤثر المصفوفة في الفهرس والتقرير
يصبح فهرس المصفوفة multikey بقيود للتركيب والتغطية. توسع $unwind الوثيقة لصفوف فتغير المستوى وقد تضاعف الربط. حدد حفظ الفارغ والغائب وnull. حد المصفوفات ولا تجعل الأصل الساخن سجلاً لا نهائياً. اختبر التكرار والفراغ وغياب الحقول قبل التحسين.
الأخطاء الشائعة وإصلاحها
يطابق الحجز رغم غياب بند يحقق الشرطين
- لماذا يحدث؟
- طابقت المسارات عناصر مختلفة.
- كيف تصلحه؟
- استخدم $elemMatch لشرط العنصر الواحد.
- كيف تتجنب تكراره؟
- ضمّن عناصر تقسم المطابقة في العينة.
يغير التحديث عناصر أكثر من المتوقع
- لماذا يحدث؟
- طابقت الصياغة كل عنصر مؤهل.
- كيف تصلحه؟
- حدد هوية العنصر ومرشحه الدقيق.
- كيف تتجنب تكراره؟
- اختبر التكرار ووثق النطاق.
تفقد مساواة الوثيقة حقيقة داخلية
- لماذا يحدث؟
- استخدمت مساواة الكل لسؤال حقل.
- كيف تصلحه؟
- استعلم المسار إلا إذا قصدت مساواة كاملة.
- كيف تتجنب تكراره؟
- ميز المسار والعنصر والمصفوفة كلها.
اختبر فهمك
1. بند PEN كميته 2 وآخر PAD كميته 10. هل يطابق سؤال PEN بكمية >=5؟
اعرض الحل المشروح
لا ينبغي إذا قصد بنداً واحداً. قد تطابق النقطتان عنصرين، فاستخدم $elemMatch بالشكل المذكور. أبق المثال المضاد؛ لا تكشف عينة بند واحد الخطأ.
2. يملك الحجز بندي PEN. ماذا يفعل $[line] وما الحل إن لزم واحد؟
اعرض الحل المشروح
يزيد الكميتين. أعط العناصر معرفات مستقرة ورشح المقصود مع شروطه إذا لزم واحد. لا تفترض ثبات الموضع أو فرادة أول SKU، ووثق عدد العناصر المتوقع وافحص النتيجة.
أهم ما تعلمته
- تربط $elemMatch الشروط بعنصر واحد.
- تحتاج الوثيقة والعنصر ومستوى التقرير فحوصاً منفصلة.