MongoDB

دليل شامل للانضمام الأيسر في MongoDB

Spread the love

محتويات الجدول

فهم الـ Left Joins ونهج MongoDB

في قواعد بيانات SQL، يضمن الـ Left Join تضمين جميع الصفوف من الجدول الأيسر في مجموعة النتائج. إذا وجد صف مطابق في الجدول الأيمن، فسيتم ضم البيانات المقابلة؛ وإلا، سيتم ملء حقول الجانب الأيمن بقيم NULL. لا تحتوي MongoDB، بصفتها قاعدة بيانات NoSQL، على أمر “LEFT JOIN” مباشر. ومع ذلك، يمكننا تحقيق نفس الوظائف باستخدام عامل التشغيل القوي $lookup ضمن إطار التجميع.

إتقان عامل التشغيل $lookup

يقوم عامل التشغيل $lookup بضم المستندات من مجموعتين بناءً على الحقول المحددة. من المهم فهم أنه يُعيد جميع المستندات من المجموعة “اليسرى”، بغض النظر عما إذا تم العثور على تطابق في المجموعة “اليمنى”. دعونا نفحص بناء الجملة الخاص به:


db.collection1.aggregate([
  {
    $lookup: {
      from: "collection2",       // المجموعة اليمنى
      localField: "field1",     // الحقل في collection1 للبحث عن المطابقة
      foreignField: "field2",    // الحقل في collection2 للبحث عن المطابقة
      as: "results"              // حقل المصفوفة لحفظ المستندات المطابقة
    }
  }
])

ضع في اعتبارك مجموعتين: customers و orders.

مجموعة customers:

_id name city
1 John Doe نيويورك
2 Jane Smith لندن
3 Peter Jones باريس

مجموعة orders:

_id customer_id amount
1 1 100
2 1 200
3 2 50

لإجراء عملية Left Join، نستخدم $lookup:


db.customers.aggregate([
  {
    $lookup: {
      from: "orders",
      localField: "_id",
      foreignField: "customer_id",
      as: "orders"
    }
  }
])

يعيد هذا جميع العملاء. أولئك الذين لديهم طلبات سيكون لديهم مصفوفة orders مملوءة؛ أما أولئك الذين ليس لديهم طلبات فسيكون لديهم مصفوفة فارغة.

صقل النتائج باستخدام التصفية

تسمح مرحلة $match بالتصفية بعد عملية الضم. على سبيل المثال، للعثور على العملاء الذين لديهم طلبات تتجاوز 100 دولار:


db.customers.aggregate([
  {
    $lookup: { /* ... (نفس $lookup أعلاه) ... */ }
  },
  {
    $match: {
      "orders.amount": { $gt: 100 }
    }
  }
])

تقنيات التجميع المتقدمة

تتجاوز مرونة خط أنابيب التجميع $lookup و $match. يمكن دمج مراحل مثل $unwind (لتفكيك المصفوفات)، و $group (لتجميع البيانات)، و $sort ( لترتيب النتائج) لتحويلات بيانات معقدة. على سبيل المثال، لحساب إجمالي إنفاق كل عميل:


db.customers.aggregate([
  {
    $lookup: { /* ... (نفس $lookup أعلاه) ... */ }
  },
  { $unwind: "$orders" },
  {
    $group: {
      _id: "$_id",
      name: { $first: "$name" },
      totalSpent: { $sum: "$orders.amount" }
    }
  }
])

تحسين الأداء

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

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

س: ماذا لو كان field1 أو field2 يمكن أن يحتوي على تطابقات متعددة؟ ج: سيُعيد $lookup جميع المستندات المطابقة في مصفوفة results. استخدم $unwind لمعالجة كل منها بشكل فردي.

س: هل يمكنني إجراء RIGHT JOIN؟ ج: ليس مباشرة. قم بعكس المجموعات في $lookup وتعامل مع المستندات غير المطابقة وفقًا لذلك.

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *