مفتاح MongoDB الأساسي: مثال لتعيين حقل _id باستخدام ObjectId()

⚡ ملخص ذكي

MongoDB المفتاح الأساسي هو حقل _id الذي يُعرّف كل مستند في المجموعة بشكل فريد. يحتوي افتراضيًا على معرّف كائن مُنشأ تلقائيًا، ولكن يمكنك أيضًا تعيين قيمة خاصة بك لحقل _id عند إدراج مستند.

  • 🔑 الدور الرئيسي الأساسي: يُعد حقل _id المفتاح الأساسي الذي يُعرّف كل مستند بشكل فريد في MongoDB جمع.
  • 🆔 معرّف الكائن الافتراضي: إذا حذفت _id، MongoDB يقوم تلقائيًا بإضافة قيمة ObjectId فريدة مكونة من 12 بايت إلى المستند.
  • ⏱️ مرتب حسب الوقت: يبدأ معرف الكائن بطابع زمني مكون من 4 بايت، لذا يمكن فرز المعرفات تقريبًا حسب وقت الإنشاء.
  • ✍️ مفاتيح مخصصة: يمكنك إدخال قيمة _id الخاصة بك، مثل رقم أو سلسلة نصية، عند إدراج مستند.
  • 🔒 ثابت: بمجرد تعيين قيمة _id، لا يمكن تغييرها؛ يجب عليك حذفها وإعادة إدخالها لتغييرها.

ما هو المفتاح الأساسي في MongoDB?

In MongoDB، حقل _id هو المفتاح الأساسي للمجموعة بحيث يمكن تحديد كل مستند بشكل فريد في المجموعة. يحتوي الحقل _id على قيمة ObjectID فريدة.

بشكل افتراضي عند إدراج المستندات في المجموعة، إذا لم تقم بإضافة اسم حقل مع _id في اسم الحقل، ثم MongoDB سيضيف تلقائيًا حقل معرف الكائن كما هو موضح أدناه

المفتاح الأساسي في MongoDB

عندما تقوم بالاستعلام عن المستندات الموجودة في مجموعة، يمكنك رؤية ObjectId لكل مستند في المجموعة.

إذا كنت تريد التأكد من ذلك MongoDB لا يقوم بإنشاء حقل _id عند إنشاء المجموعة وإذا كنت تريد تحديد المعرف الخاص بك باعتباره _id للمجموعة، فأنت بحاجة إلى تحديد هذا بشكل صريح أثناء إنشاء المجموعة.

عند إنشاء حقل معرف بشكل صريح، يجب إنشاؤه باستخدام _id في اسمه.

دعونا نلقي نظرة على مثال حول كيف يمكننا تحقيق ذلك.

db.Employee.insert({_id:10, "EmployeeName" : "Smith"})

Code التفسير:

  1. نحن نفترض أننا نقوم بإنشاء المستند الأول في المجموعة، وبالتالي في العبارة أعلاه أثناء إنشاء المجموعة، قمنا بتعريف الحقل _id بشكل واضح وحدد قيمة له.

إذا تم تنفيذ الأمر بنجاح واستخدمت الآن أمر البحث لعرض المستندات في المجموعة، فسيتم عرض الناتج التالي

الإخراج:

المفتاح الأساسي في MongoDB

يُظهر الإخراج بوضوح أن حقل _id الذي حددناه أثناء إنشاء المجموعة يُستخدم الآن كمفتاح أساسي للمجموعة.

ما هو ObjectId في MongoDB?

يُعد ObjectId نوع القيمة الافتراضي الذي MongoDB يُعيّن هذا المعرّف للمفتاح الأساسي _id. وهو معرّفٌ مكوّن من 12 بايت، مصمّم ليكون فريدًا عالميًا عبر الخوادم والمجموعات، لذا نادرًا ما يحصل مستندان على القيمة نفسها. ولأن برنامج تشغيل العميل يستطيع إنشاء ObjectId دون طلب ذلك من الخادم، MongoDB يمكن إدخال المستندات بسرعة والتوسع عبر العديد من الأجهزة دون الحاجة إلى عداد مركزي.

يُخزَّن كل معرّف كائن (ObjectId) بصيغة ثنائية مضغوطة، ولكنه يُعرض كسلسلة سداسية عشرية مكونة من 24 حرفًا، على سبيل المثال ObjectId(“507f1f77bcf86cd799439011”). تعتمد البايتات الأولى على الوقت الحالي، مما يعني أن القيم تزداد تدريجيًا مع إنشاء المستندات. هذا يجعل معرّف الكائن فريدًا، كما يُتيح إمكانية فرزه تقريبًا حسب ترتيب الإدخال، وهي خاصية مفيدة عند الرغبة في عرض أحدث السجلات أو أقدمها أولًا.

هيكل MongoDB معرف الكائن

A MongoDB يبلغ طول معرّف الكائن 12 بايتًا بالضبط، ولكل جزء منه معنى محدد. يساعد فهم البنية على تفسير سبب كون معرّفات الكائنات فريدة ومرتبة زمنيًا.

  • الطابع الزمني المكون من 4 بايت: عدد الثواني منذ بداية حقبة يونكس، مسجلاً وقت إنشاء معرّف الكائن. وهذا يجعل المعرّفات قابلة للفرز حسب الوقت.
  • قيمة عشوائية مكونة من 5 بايت: يتم إنشاء قيمة مرة واحدة لكل عملية، تجمع بين هوية الجهاز وهوية العملية، بحيث ينتج العملاء المختلفون معرفات مختلفة.
  • عداد متزايد مكون من 3 بايت: عداد يبدأ من قيمة عشوائية ويزداد مع كل معرف كائن جديد في نفس الثانية، مما يمنع التصادمات أثناء عمليات الإدخال السريعة.

تضمن هذه الأجزاء الثلاثة مجتمعةً أن يكون كل معرّف كائن فريدًا، حتى عند إدراج العديد من المستندات في نفس اللحظة عبر خوادم مختلفة. يمكنك قراءة وقت الإنشاء المضمن في أي وقت عن طريق استدعاء دالة getTimestamp() على معرّف الكائن.

مزايا استخدام ObjectId كمفتاح أساسي

يوفر استخدام معرّف الكائن الافتراضي كمفتاح أساسي لـ _id العديد من المزايا العملية، ولهذا السبب يستخدمه معظم MongoDB تعتمد المجموعات عليه:

  • التوليد التلقائي: لست بحاجة إلى إنشاء أو إدارة القيم الرئيسية بنفسك، مما يقلل من فرصة وجود مفاتيح مكررة.
  • التفرد العالمي: تظل معرفات الكائنات فريدة عبر الخوادم، لذا فهي تعمل بشكل جيد في عمليات النشر الموزعة والمجزأة.
  • الطابع الزمني المدمج: يتيح لك وقت الإنشاء المضمن فرز المستندات أو تصفيتها حسب العمر دون الحاجة إلى حقل تاريخ إضافي.
  • أداء عالي: يُجنّب توليد البيانات من جانب العميل الحاجة إلى إرسال البيانات إلى الخادم ذهابًا وإيابًا، مما يُحافظ على...ping يتم إدخالها بسرعة.

على الرغم من أن ObjectId مناسب لمعظم التطبيقات، إلا أنه لا يزال بإمكانك اختيار _id مخصص، مثل عنوان بريد إلكتروني أو رمز منتج، عندما يُسهّل مفتاح العمل الطبيعي الاستعلامات. يعتمد الاختيار الأمثل على كيفية تخطيطك للبحث عن بياناتك وربطها.

الأسئلة الشائعة

لا. حقل _id غير قابل للتغيير بمجرد إنشاء المستند. لتغييره، يجب حذف المستند الحالي وإدراج مستند جديد بالقيمة المطلوبة لـ _id.

يقبل حقل _id معظم أنواع BSON، بما في ذلك ObjectId والأعداد الصحيحة والسلاسل النصية وحتى المستندات المضمنة. الشرط الوحيد هو أن تكون القيمة فريدة ضمن المجموعة ولا يمكن أن تكون مصفوفة.

نعم. MongoDB يقوم النظام بإنشاء فهرس فريد على حقل _id لكل مجموعة تلقائيًا. لا يمكن حذف هذا الفهرس، مما يجعل عمليات البحث باستخدام المفتاح الأساسي سريعة جدًا.

يمكن للذكاء الاصطناعي شرح الطابع الزمني لمعرف الكائن، وإنشاء رمز لـtracاستخدم دالة getTimestamp() لحساب وقت الإنشاء، ثم حوّل معرّفات الكائنات إلى سلاسل نصية، وساعد في ذلك.ping يتمكن المطورون من تصحيح الأخطاء وفهم معرّفات المستندات بسرعة أكبر.

نعم. يمكن للذكاء الاصطناعي أن ينصحك بما إذا كان يجب الاحتفاظ بمعرف الكائن الافتراضي أو استخدام معرف مخصص مثل البريد الإلكتروني أو UUID، بناءً على أنماط الاستعلام الخاصة بك، واحتياجات التفرد، وخطط التجزئة.

تلخيص هذه التدوينة بـ: