محتويات الدورة

MongoDB / المتوسط: التجميع وعقود التطبيق / الدرس 10

التحقق من المخطط وتطوره الآمن

استخدم تحققاً يراعي BSON مع تطوير إصدارات الوثائق، وافصل فرض الكتابة الجديدة عن حصر البيانات القديمة وترحيلها.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تعريف الوجود والأنواع والمجالات بـ $jsonSchema.
  • تخطيط مستوى التحقق وإجرائه وانتقال الإصدار.

تحتاج المرونة عقداً أيضاً

تختلف الأشكال افتراضياً وتحتاج دلالة متوقعة. يرفض التحقق كتابات تخالف الوجود والنوع والقواعد، ويكمل API والمشغل. لا يوفر مفتاحاً خارجياً عاماً، والتفرد لفهرس مناسب. حدد الإلزام والغياب وnull والإصدارات المقروءة قبل القيد.

صرح بأنواع BSON بوعي

يلزم التعريف sku نصية وqty من BSON int غير سالبة. يجب أن يرسل العميل النوع الصحيح لا double بمظهر مماثل. تبقى الحقول الأخرى جائزة لغياب منعها. الإنشاء توضيحي بقاعدة تدريب؛ تحتاج المجموعة الموجودة مسار تعديل مراجعاً ولا تعيد createCollection تجهيز كل القديم.

javascript mongosh توضيحية؛ النتائج المتوقعة مستنتجة وليست قياسات.
db.getSiblingDB('quay_lab').createCollection('inventoryChecked', {
  validator: { $jsonSchema: {
    bsonType: 'object', required: ['sku', 'qty'],
    properties: {
      sku: { bsonType: 'string' },
      qty: { bsonType: 'int', minimum: 0 }
    }
  } },
  validationAction: 'error', validationLevel: 'strict'
});

يقبل شكلاً مثل {sku:"PEN",qty:NumberInt(3)} ويرفض الغياب والنص والسالب.

لا يثبت الفرض صحة البيانات القديمة

لا يمسح القيد الجديد القديم ويصلحه كله. يحدد validationLevel تحديث القديم ويختلف strict عن moderate، ويحدد validationAction الرفض أو التحذير المدعوم. لا يفرض التحذير الثابت النهائي. احصر الأشكال واحفظ المرفوض وخطة الرجوع؛ قد يخفي التجاوز الواسع تناقضاً بدل الفشل الواضح.

افحص مجموعة الترحيل قبل التحويل

يجمع الحصر بالإصدار ونوع qty الحقيقي وتكشف $type الغياب بدل عده صحيحاً. يعتمد الخرج على العينة. لا يفيد رقم الإصدار دون قارئ وكاتب متفقين. اجعل القديم متوافقاً والجديد يكتب الشكل المقبول ثم تحقق قبل تضييق القاعدة وإزالة البديل.

javascript mongosh توضيحية؛ النتائج المتوقعة مستنتجة وليست قياسات.
db.getSiblingDB('quay_lab').inventory.aggregate([
  { $group: { _id: { version: '$schemaVersion', qtyType: { $type: '$qty' } }, count: { $sum: 1 } } },
  { $sort: { '_id.version': 1, '_id.qtyType': 1 } }
]);

استخدم الحصر دليلاً لترحيل محدود لا أمراً بتحويل آلي.

استخدم تفاصيل التحقق المنظمة بعناية

يستخدم فشل التحقق غالباً121 والتكرار11000 ولهما علاجان. قد تتغير الرسالة والبنية بالإصدار؛ اعتمد الرموز والحقول المدعومة لا مطابقة نص هش. حدث الفهارس والتفسير والتكامل مع الترحيل. تضيف $jsonSchema خصائص BSON ولا تعد بكل أحدث معيار JSON Schema.

الأخطاء الشائعة وإصلاحها

Document failed validation (121)

لماذا يحدث؟
يخالف الشكل بعد الكتابة القيد النشط.
كيف تصلحه؟
افحص الوجود والنوع والتفاصيل قبل التصحيح.
كيف تتجنب تكراره؟
اختبر إرسال المشغل مقابل العقد.

تبقى سجلات قديمة خاطئة بعد التحقق

لماذا يحدث؟
اختلط فرض الكتابة بالتنظيف الرجعي.
كيف تصلحه؟
احصر القديم وانقله بعملية منفصلة محدودة.
كيف تتجنب تكراره؟
حدد قبول القديم والتقارب قبل التضييق.

يُرفض صحيح ظاهري

لماذا يحدث؟
أرسل المشغل نوع BSON عدديّاً مختلفاً.
كيف تصلحه؟
استخدم المنشئ أو وسع الأنواع بوعي.
كيف تتجنب تكراره؟
اختبر النوع لا القيمة المطبوعة فقط.

اختبر فهمك

1. يشترط القيد int غير سالبة. هل يقبل qty:"3" وهل يصلح النص القديم؟

اعرض الحل المشروح

لا يقبل النص ولا يحوله تثبيت القيد. احصره وتحقق من الشرعي وانقله بمعالجة رفض، وأكد إرسال الصحيح قبل الفرض النهائي. لا تتجاوز التحقق لإخفاء خطأ الإرسال.

2. لماذا تنشر توافق القارئ قبل إزالة الحقول القديمة؟

اعرض الحل المشروح

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

أهم ما تعلمته

  • يحمي التحقق الكتابة ويثبت الترحيل تقارب التاريخ.
  • يجب اتفاق عقد BSON وإرسال المشغل.

المراجع الرسمية