MongoDB / الأساسي: أسس الوثائق / الدرس 3
أنواع BSON والتواريخ والأعداد الدقيقة
احفظ الأنواع عبر الصدفة والمشغل وAPI، وميز المال العشري الدقيق والمعرف الصحيح والتاريخ وغياب الحقل أو null.
في هذه الصفحة
أهداف الدرس
- اختيار تمثيل الأعداد والتواريخ بوعي.
- توقع الاستعلام والتحويل بحسب النوع.
لا يمثل عدد JavaScript كل أعداد BSON
تدعم MongoDB الصحيح والطويل وdouble وDecimal128. لعدد JavaScript حد دقة، فلا تمرر معرفاً كبيراً خلال عدد غير دقيق قبل BSON. استخدم Long أو BigInt وفق المشغل. يفيد Decimal128 المال الدقيق ويجب حفظ دلالته بالحساب أيضاً. النص "12.30" ليس سعراً عشرياً رغم تشابه العرض.
أنشئ قيماً صريحة في الصدفة
تنشئ المساعدات كمية صحيحة ورسم Decimal128 وتاريخاً بإشارة UTC. ليست دوال JavaScript عامة. المتوقع ثلاثة و12.30 واللحظة المحددة، وقد يختلف عرض Extended JSON والصدفة. لا تثبت السلسلة المعروضة حفظ النوع عبر المشغل؛ وثق BSON وافحصها بأدوات تراعي النوع.
const values = {
qty: NumberInt(3),
fee: NumberDecimal('12.30'),
acceptedAt: ISODate('2026-10-01T09:00:00.000Z')
};
print(values.fee.toString());
print(values.acceptedAt.toISOString());
12.30
2026-10-01T09:00:00.000Z
يشتق الرسم والوقت من قيم صريحة لا سجلات مرصودة.
الحقل الغائب ليس null الصريحة
قد تغيب deliveredAt أو توجد بقيمة null. تطابق { deliveredAt: null } الحالتين، خلاف توقع SQL. استخدم $type للفراغ الصريح و$exists للوجود. حدد هل الغياب إصدار قديم أو إدخال ناقص أو غياب تجاري مكافئ، ولا تمح المعاني بالتحويل. الصفر والنص الفارغ حالتان أخريان.
افحص النوع المخزن قبل التحويل
يعرض التجميع نوع كل رسم، وتفرق $type التعبيرية الغياب وnull والأعداد فتفيد حصر الترحيل. لا يصلح الاستعلام البيانات. يعتمد الخرج على العينة، ومزيج string وdecimal دليل لا إذن تحويل أعمى. يحتاج النص غير الصالح سياسة خطأ أو عزل حتى لا تفقد التقارير سجلات.
db.getSiblingDB('quay_lab').parcels.aggregate([
{ $project: { fee: 1, feeType: { $type: '$fee' } } },
{ $sort: { _id: 1 } },
{ $limit: 20 }
]);
افحص feeType مع القيم دون ادعاء مجموعة أو توزيع فعلي.
طابق الدلالة لا مظهر العرض
تخضع المقارنة عموماً لحدود النوع مع تكافؤات عددية موثقة؛ لا تفترض مطابقة النص العددي. لا يصبح التاريخ النصي تاريخ BSON. استخدم مجال لحظات نصف مفتوح واحفظ المنطقة الأصلية عند الحاجة. مقارنة النص بسيطة ثنائية افتراضياً ما لم يطبق ترتيب، ويؤثر في المطابقة والفرز والفهرسة؛ وحد السياسة.
الأخطاء الشائعة وإصلاحها
يتغير معرف كبير بعد مروره بـ JavaScript
- لماذا يحدث؟
- مر عبر Number خارج دقة الصحيح الآمنة.
- كيف تصلحه؟
- استخدم تمثيل BSON صحيحاً دقيقاً مدعوماً.
- كيف تتجنب تكراره؟
- اختبر ما يتجاوز المجال الآمن والتصدير.
يشمل استعلام null وثائق بلا الحقل
- لماذا يحدث؟
- تطابق مساواة null الغياب أيضاً.
- كيف تصلحه؟
- استخدم الوجود والنوع بحسب المعنى.
- كيف تتجنب تكراره؟
- ضمّن الغياب والفراغ والصفر والنص الفارغ.
يفقد مجال التاريخ تواريخ نصية
- لماذا يحدث؟
- اعتُبرت السلاسل مكافئة لتاريخ BSON.
- كيف تصلحه؟
- احصر الأنواع وحول المقبول بترحيل مراجع.
- كيف تتجنب تكراره؟
- افرض التاريخ بالمشغل والتحقق.
اختبر فهمك
1. لوثيقتين رسم NumberDecimal("9.00") ونص "100.00". هل تكفي المقارنة العددية لكليهما؟
اعرض الحل المشروح
لا؛ يخالف الثاني النوع رغم المظهر. احصر الأنواع وتحقق من التحويل واحفظ المرفوض للتحقيق قبل النقل، وحدد التقرير أثناء الانتقال. قد تخفي تصفية النوع أحداثاً صحيحة وتنتج مجموعاً ظاهره مقبول.
2. ماذا يضيع عند حفظ زمن محلي كتاريخ BSON فقط؟
اعرض الحل المشروح
لا يحتفظ اسم المنطقة وسياق الإدخال بمجرد حفظ اللحظة. احفظهما إن لزما واستخدم إزاحة صريحة ثم تحقق من اللحظة. لا تستنتج المنطقة من UTC أو تساوِ مدة الأيام حول تغير الساعة.
أهم ما تعلمته
- أنواع BSON جزء من العقد لا زينة عرض.
- يحتاج الوجود وnull وفشل التحويل سياسات صريحة.