MongoDB Academy · درس

التضمين: علاقات واحد إلى عدد قليل

سيضمّن المتعلمون مستندات فرعية للبيانات شديدة الترابط، ويقيسون ميزة أداء القراءة الناتجة عن تجميع المعلومات المرتبطة في موضع واحد.

الدرس 1 من 413 خطوة

التضمين: علاقات واحد إلى عدد قليل درس مجاني في MongoDB Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في MongoDB Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة MongoDB Academy 4 دروس في المجموع.

ما المقصود بتضمين المستندات؟

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

علاقة واحد إلى عدد قليل

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

تضمين عناوين المستخدم

لنفترض وجود مجموعة users يمتلك فيها كل مستخدم عنوانًا أو عنوانين للتوصيل. بدلًا من إنشاء مجموعة addresses منفصلة، ضمّن العناوين مباشرةً. وهذا يعني أن العثور على مستخدم وعناوينه يتطلب استعلامًا واحدًا من دون أي عمليات ربط.

db.users.insertOne({
  name: 'Alice',
  email: 'alice@example.com',
  addresses: [
    { label: 'home', street: '123 Maple St', city: 'Austin', zip: '78701' },
    { label: 'work', street: '456 Oak Ave', city: 'Austin', zip: '78702' }
  ]
});

قراءة البيانات المضمّنة باستعلام واحد

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

// Retrieve user AND their addresses in a single read
const user = await db.collection('users').findOne(
  { email: 'alice@example.com' },
  { projection: { name: 1, addresses: 1 } }
);
console.log(user.addresses); // Array of embedded address objects

تحديث مستند فرعي مضمّن

لتحديث مستند فرعي مضمّن، استخدم المعامل الموضعي $ أو تدوين النقاط. فعلى سبيل المثال، يؤدي تغيير الرمز البريدي لعنوان منزل Alice إلى استهداف عنصر المصفوفة المحدد الذي يطابق شرطًا في عامل التصفية. وتحدث تحديثات البيانات المضمّنة ذريًا على مستوى المستند، ولا تحتاج إلى معاملة.

db.users.updateOne(
  { email: 'alice@example.com', 'addresses.label': 'home' },
  { $set: { 'addresses.$.zip': '78703' } }
);

ميزة أداء القراءة

تخزّن MongoDB المستندات على القرص في كتل BSON متجاورة. عند تضمين البيانات المرتبطة، يقرأ المحرك كتلة تخزين واحدة بدلًا من فحص مجموعتين منفصلتين. ويُعد تجميع البيانات المرتبطة في مكان واحد السبب الأساسي لتفوّق المستندات المضمّنة على الإسناد المرجعي في أعباء العمل كثيفة القراءة، حيث يُستَخدم المستند الأصلي ومستنداته الفرعية معًا في معظم الحالات.

التضمين في Mongoose

في Mongoose، تعرّف مخططات المستندات الفرعية وتضمّنها داخل مخطط المستند الأصلي. وتتعامل Mongoose مع المصفوفات المضمّنة باعتبارها مصفوفات مستندات فرعية، فتوفّر التحقق الكامل من الأنواع وخطافات دورة الحياة لكل عنصر. ويحفظ النموذج الأصلي الشجرة بأكملها ذريًا.

const addressSchema = new mongoose.Schema({
  label: String,
  street: String,
  city: String,
  zip: String
});

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  addresses: [addressSchema]  // embedded array of sub-documents
});

const User = mongoose.model('User', userSchema);

متى يتألق التضمين؟

يعمل التضمين بأفضل صورة عندما: (1) تُستَخدم البيانات الفرعية دائمًا مع المستند الأصلي؛ (2) يكون عدد العناصر الفرعية صغيرًا ومحدودًا؛ (3) لا تحتاج العناصر الفرعية إلى دورة حياة مستقلة (أي لا يُستعلم عنها أو تُحدّث بمعزل عن المستند الأصلي). إذا تحققت الشروط الثلاثة، فسيكون التضمين الخيار الأمثل على الأرجح.

حد حجم المستند

يبلغ الحد الأقصى الصارم لحجم كل مستند في MongoDB 16 MB. ونادرًا ما يمثل ذلك مشكلة في علاقات الواحد إلى عدد قليل؛ فمستخدم لديه عشرة عناوين أو طلب يضم عشرين عنصرًا تفصيليًا يبقى ضمن الحد بفارق كبير. ومع ذلك، ينبغي مراقبة نمو المستند بمرور الوقت للتأكد من أن التضمين لا يدفع المستندات نحو الحد الأقصى.

التضمين في مقابل الإسناد المرجعي باختصار

استخدم هذه المقارنة السريعة لتوجيه اختيارك:

  • التضمين: استعلام واحد، وتحديثات ذرية، وعدد صغير ومحدود من العناصر الفرعية
  • الإسناد المرجعي: عدد مرن من العناصر الفرعية، وعناصر فرعية مشتركة، واستعلامات مستقلة للعناصر الفرعية

في علاقات الواحد إلى عدد قليل، يتفوق التضمين في كل المقاييس تقريبًا. فهو يجنّبك رحلات الشبكة الإضافية ويحافظ على بساطة المخطط.

مثال عملي: وسوم منشور مدونة

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

db.posts.insertOne({
  title: 'Getting Started with MongoDB',
  body: 'MongoDB is a document database...',
  tags: ['mongodb', 'nosql', 'database'],
  author: 'Alice',
  createdAt: new Date()
});

// Index the tags array for fast tag-based lookups
db.posts.createIndex({ tags: 1 });

تحقق سريع

اختبر مدى فهمك لمفاهيم MongoDB وقواعد بيانات NoSQL التي تناولها هذا الدرس.

مراجعة الدرس

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

البدء مجانًا

تعلم JavaScript مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

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

هل درس «التضمين: علاقات واحد إلى عدد قليل» مجاني؟

نعم — نص درس «التضمين: علاقات واحد إلى عدد قليل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة MongoDB Academy، انتقل إلى CoddyKit PRO. تتضمن دورة MongoDB Academy 4 دروس في المجموع.

ماذا ستتعلم في «التضمين: علاقات واحد إلى عدد قليل»؟

سيضمّن المتعلمون مستندات فرعية للبيانات شديدة الترابط، ويقيسون ميزة أداء القراءة الناتجة عن تجميع المعلومات المرتبطة في موضع واحد. تتمرن على MongoDB Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ MongoDB Academy؟

لا تُشترط خبرة سابقة. MongoDB Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «التضمين: علاقات واحد إلى عدد قليل»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس MongoDB Academy هذا؟

نعم. كل درس في MongoDB Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التضمين: علاقات واحد إلى عدد قليل
  2. الإحالة: علاقات واحد إلى متعدد ومتعدد إلى متعدد
  3. النمط المضاد للمصفوفة غير محدودة الحجم
  4. إطار اتخاذ قرارات تصميم المخطط
← العودة إلى MongoDB Academy