MongoDB / المتوسط: التجميع وعقود التطبيق / الدرس 9
الفهارس المركبة ومتعددة القيم والفريدة
صمم الفهارس من الشروط والفرز وافهم المصفوفات والتفرد والانتهاء، ووازن البحث بكلفة التخزين والكتابة.
في هذه الصفحة
أهداف الدرس
- ربط ترتيب المفتاح بالمساواة والفرز والمجال.
- شرح عقود التفرد والجزئية وmultikey وTTL.
الفهرس بنية مصانة لا سرعة مجانية
تقلل الفهارس الفحص وتخدم الفرز وتزيد الكتابة والذاكرة والتخزين. قد يلائم المسح مجموعة صغيرة أو شرطاً واسعاً. يتحكم ترتيب المركب بالبادئات، فوازن المساواة والفرز والمجال. طابق الترتيب والنوع، وقد تستخدم الخطة فهرساً وتفحص مرشحين كثيرين؛ ليست كلمة مفهرس معيار قبول.
طابق استعلام خط زمني لعميل
يبدأ المرشح بمساواة customerId ثم ترتيب createdAt و_id. يسقط الاستعلام حقول الفهرس وتعتمد التغطية على المطلوب والخطة. لا نختلق عدداً أو زمناً. الإنشاء توضيحي لمختبر لا تغيير خدمة؛ راجع التداخل وإنتاجية الكتابة قبل الإضافة.
db.getSiblingDB('quay_lab').shipments.createIndex({ customerId: 1, createdAt: -1, _id: -1 });
db.getSiblingDB('quay_lab').shipments.find(
{ customerId: 7 }, { customerId: 1, createdAt: 1, _id: 1 }
).sort({ createdAt: -1, _id: -1 }).limit(20);
الترتيب اقتراح لشكل واحد وتفحص الخطة بعينة ممثلة.
ينطبق التفرد على المفاتيح والوثائق المفهرسة
يمنع الفريد تعارض المفاتيح بين الوثائق ويتفاعل مع الغياب وnull والمصفوفة والترتيب والتجزئة. قد يصير الغائب أو null مفتاح null فيفشل بريد اختياري متعدد. يمكن لجزئي فريد تقييد مجموعة كالبريد النصي وترك غيرها. راجع التعبيرات والإصدار ولا تفترض تفرداً متناثراً لمجرد الاختيارية.
صرح بالمجموعة المقيدة
يفهرس المرشح email النصية ويفرض التفرد ضمنها وفق المقارنة. لا يتحقق من صيغة البريد أو يوجبه. يفشل البناء عند تعارض قديم، فراجع وحل على نسخة قبل النشر. يجب أن يستلزم الاستعلام الشرط الجزئي للاستفادة الآمنة، ولا نختلق الاسم أو المدة.
db.getSiblingDB('quay_lab').customers.createIndex(
{ email: 1 },
{ unique: true, partialFilterExpression: { email: { $type: 'string' } } }
);
العقد: يتعارض البريد النصي المتكرر، والغائب وغير النصي خارج هذا الفهرس.
لـ multikey وTTL ضمانات محدودة
تصبح فهارس المصفوفة multikey تلقائياً بقيود للمصفوفات المتوازية، ولا يمنع الفريد عادة تكراراً داخل الوثيقة نفسها. تدعم TTL تنظيفاً غير متزامن ولا تضمن لحظة الحذف أو تعوض إخفاء الصلاحية الفوري. افصل القراءة والاحتفاظ والتعافي؛ ميزة الفهرس ليست تحققاً أو دورة عامة.
الأخطاء الشائعة وإصلاحها
E11000 duplicate key error
- لماذا يحدث؟
- يتعارض مفتاح فريد وقد يتعلق بـ null أو الغياب.
- كيف تصلحه؟
- افحص الفهرس ومجموعته قبل التغيير.
- كيف تتجنب تكراره؟
- اختبر الاختياري وnull والتكافؤ قبل النشر.
cannot index parallel arrays
- لماذا يحدث؟
- واجه المركب حقول مصفوفات متعددة مفهرسة بالوثيقة.
- كيف تصلحه؟
- أعد التصميم وفق البحث.
- كيف تتجنب تكراره؟
- ضمّن أشكال المصفوفة الواقعية في القبول.
تبقى الوثائق المنتهية ظاهرة مؤقتاً
- لماذا يحدث؟
- اختلط تنظيف TTL بالحذف الفوري.
- كيف تصلحه؟
- طبق شرط الانتهاء في القراءة عند لزوم الفورية.
- كيف تتجنب تكراره؟
- افصل الوصول المنتهي عن توقيت التنظيف.
اختبر فهمك
1. قد يغيب البريد ويجب تفرد النص الموجود. لماذا قد لا يناسب فهرس فريد عادي؟
اعرض الحل المشروح
قد تصير القيم الغائبة وnull مفتاحاً متعارضاً. يعبر الجزئي النصي عن قاعدة أضيق؛ تحقق من الصيغة والوجود منفصلين واختبر القديم والحالة قبل البناء. ليس البناء تنظيفاً آلياً آمناً.
2. ينتهي الرمز ظهراً ويتأخر حذف TTL. ماذا يفعل استعلام الصلاحية؟
اعرض الحل المشروح
يشترط عدم الانتهاء عند القرار مع الهوية وبقية الصلاحيات. TTL تنظيف لاحق لا فرض فوري. حدد الساعة والتجديد؛ لا يبرر الحذف اللاحق قبول المنتهي قبله.
أهم ما تعلمته
- صمم الترتيب والمجموعة من عقد البحث.
- تحل الفريدة وmultikey وTTL مشكلات مختلفة.