منشئ معرّف كائن MongoDB - إنشاء معرّفات BSON فريدة
قم بإنشاء معرّفات كائن MongoDB الفريدة على الفور باستخدام أداتنا عبر الإنترنت المجانية. أنشئ معرّفات BSON صالحة بطول 12 بايت للاختبار والتطوير والعمليات قاعدة البيانات. لا يتطلب أي تثبيت.
مولد معرف كائن MongoDB
التوثيق
ما هو ObjectID في MongoDB؟
ObjectID في MongoDB هو قيمة بطول 12 بايت، يعيّنها MongoDB افتراضيًا إلى الحقل _id لكل مستند. وتُكتب على هيئة 24 محرفًا سداسيًا عشريًا بأحرف صغيرة، مثل 507f1f77bcf86cd799439011. تنشئ هذه الأداة من 1 إلى 100 من قيم ObjectID الصالحة في المرة الواحدة، مباشرةً في المتصفح، من دون الحاجة إلى اتصال بقاعدة بيانات.
بنية ObjectID في MongoDB
يتكوّن ObjectID من ثلاثة أجزاء موضوعة واحدًا تلو الآخر:
- الطابع الزمني (4 بايت). عدد الثواني منذ 1 يناير 1970 (حقبة Unix)، مخزّنًا كعدد غير موقّع بترتيب البايتات الكبير. ويسجّل وقت إنشاء ObjectID. تخزّن أربعة بايتات قيمًا من 0 إلى 4,294,967,295، لذلك يعود الحقل إلى 0 بعد 7 فبراير 2106 عند 06:28:15 بالتوقيت العالمي المنسق (UTC).
- القيمة العشوائية (5 بايت). عدد يُختار عشوائيًا مرة واحدة عند بدء تشغيل البرنامج. ويعيد كل ObjectID ينشئه البرنامج بعد ذلك استخدام القيمة العشوائية نفسها، لذلك لا تحتاج الحواسيب المختلفة إلى التنسيق فيما بينها.
- العداد (3 بايت). عدد يبدأ عند نقطة عشوائية بين 0 و16,777,215، ويزداد بمقدار 1 مع كل ObjectID جديد. وإذا تجاوز 16,777,215، يعود إلى 0.
عند وضع الأجزاء متتابعة، تبدو بهذا الشكل:
1timestamp (8 hex chars) + random value (10 hex chars) + counter (6 hex chars) = 24 hex chars
2كانت برامج تشغيل MongoDB الأقدم تبني الجزء الأوسط من معرّف الجهاز ومعرّف العملية بدلًا من عدد عشوائي. أما برامج التشغيل الحالية، بما فيها المنطق الذي تستند إليه هذه الأداة، فتستخدم قيمة عشوائية واحدة بطول 5 بايت لكل عملية.
تنسيق ObjectID في MongoDB وصيغته
لا توجد صيغة حسابية وراء ObjectID، بخلاف النسبة المئوية أو حساب الفائدة. إذ يُنشأ بتحويل ثلاثة أعداد إلى نص سداسي عشري وضمّها متتابعة:
- خذ الوقت الحالي بالثواني منذ حقبة Unix، بعد حصره ضمن النطاق من 0 إلى 4,294,967,295 لكي يلائم أربعة بايتات. واكتبه كعدد سداسي عشري من 8 خانات.
- خذ القيمة العشوائية الثابتة للعملية، وهي عدد من 0 إلى 2^40 ناقص 1. واكتبها كعدد سداسي عشري من 10 خانات.
- خذ القيمة الحالية للعداد، من 0 إلى 16,777,215. واكتبها كعدد سداسي عشري من 6 خانات، ثم زد العداد بمقدار 1 للمعرّف التالي.
- اضمم السلاسل السداسية العشرية الثلاث، بهذا الترتيب، في سلسلة واحدة من 24 محرفًا.
مثال محلول
لنفترض أن برنامجًا بدأ عند وقت Unix البالغ 1,700,000,000 ثانية، وهو 14 نوفمبر 2023 عند 22:13:20 بالتوقيت العالمي المنسق (UTC). واختار القيمة العشوائية 3f2a91c8d4 وبدأ عداده عند 12,345.
- الطابع الزمني بالنظام السداسي عشري:
6553f100 - القيمة العشوائية بالنظام السداسي عشري:
3f2a91c8d4 - العداد بالنظام السداسي عشري:
003039
يؤدي ضم هذه القيم إلى أول ObjectID:
6553f1003f2a91c8d4003039
إذا أنشأ البرنامج ObjectID ثانيًا في الثانية نفسها، يبقى الطابع الزمني والقيمة العشوائية كما هما، لكن يرتفع العداد إلى 12,346 (00303a):
6553f1003f2a91c8d400303a
يمكن أيضًا قراءة ObjectID بالعكس. فعند إعطاء 507f1f77bcf86cd799439011، تتحول محارفه الثمانية الأولى، 8، وهي 507f1f77، إلى 1,350,508,407 ثانية منذ الحقبة، أي 17 أكتوبر 2012 عند 21:13:27 بالتوقيت العالمي المنسق (UTC).
الاستخدامات الشائعة لـ ObjectID في MongoDB
- المفاتيح الأساسية. يضع MongoDB تلقائيًا قيمة ObjectID في الحقل
_idللمستند، ما لم تُحدَّد قيمة أخرى. - البحث حسب وقت الإنشاء. بما أن الطابع الزمني مضمّن، يمكن للبرنامج قراءة وقت إنشاء المستند التقريبي من دون حقل تاريخ منفصل.
- الفرز حسب ترتيب الإدراج. يؤدي فرز المستندات حسب
_idإلى فرزها تقريبًا حسب وقت الإنشاء، لأن الطابع الزمني يأتي أولًا في القيمة. - بيانات الاختبار والبيانات الوهمية. يستخدم المطورون قيم ObjectID المُنشأة لبناء مستندات نموذجية أو اختبارات آلية من دون تشغيل قاعدة بيانات.
ObjectID في MongoDB مقارنةً بـ UUID
UUID، أي المعرّف الفريد عالميًا، هو قيمة بطول 16 بايت، أي أكبر بأربعة بايتات من ObjectID. وعادةً ما يكون UUID القياسي عشوائيًا بالكامل، لذلك لا يكشف عن وقت الإنشاء ولا يُرتّب حسب ترتيب الإنشاء. أما ObjectID فأقصر ويُرتّب تقريبًا بحسب وقت الإنشاء، وهذا أحد أسباب استخدام MongoDB له افتراضيًا، رغم أنه لا يوفّر ضمان التفرد الرسمي نفسه الذي يوفّره UUID المُنشأ بطريقة سليمة.
الأسئلة الشائعة
فيمَ يُستخدم ObjectID في MongoDB؟
إنه القيمة الافتراضية التي يضعها MongoDB في الحقل _id للمستند، ولذلك يحصل كل مستند على مفتاح فريد من دون إعداد إضافي.
هل يُضمن تفرد قيم ObjectID في MongoDB؟ ليس بالمعنى الرسمي أو الرياضي، لكن احتمال التصادم ضئيل للغاية. إذ سيتعين على قيمتي ObjectID استخدام القيمة العشوائية نفسها وموضع العداد نفسه في الثانية نفسها، وهو ما يحدث عادةً داخل عملية واحدة فقط.
هل يمكن معرفة تاريخ الإنشاء من ObjectID؟ نعم. فأول 8 محارف سداسية عشرية، التي تعادل 4 بايتات، تخزّن عدد الثواني منذ حقبة Unix. ويؤدي تحويل هذا العدد إلى تاريخ إلى إعطاء وقت الإنشاء التقريبي.
كم عدد قيم ObjectID التي يمكن لهذا المولّد إنشاؤها دفعة واحدة؟ بين 1 و100 قيمة في كل دفعة. وتشترك جميع المعرّفات في الدفعة في القيمة العشوائية نفسها على مستوى العملية، ولكل منها عداد يزيد بمقدار واحد عن السابق.
هل يمكن استخدام قيم ObjectID في MongoDB خارج MongoDB؟ نعم. فهي مجرد قيم بطول 12 بايت مشفّرة كنص سداسي عشري، ولذلك تعمل أيضًا كمعرّفات فريدة في الأنظمة الأخرى، مع أن نظام المعرّفات الخاص بقاعدة البيانات قد يكون أنسب لاحتياجاتها.
هل هذا المولّد متصل بقاعدة بيانات MongoDB حقيقية؟ لا. فهو يعمل بالكامل في المتصفح، ولا يقرأ من أي قاعدة بيانات ولا يكتب فيها.
المراجع
- "ObjectId." دليل MongoDB، https://www.mongodb.com/docs/manual/reference/method/ObjectId/.
- "ObjectId Specification." مواصفات BSON من MongoDB، https://github.com/mongodb/specifications/blob/master/source/bson-objectid/objectid.md.
- "BSON Types." مواصفات BSON، https://bsonspec.org/spec.html.