محتويات الجدول
- فهم الـ Left Joins ونهج MongoDB
- إتقان عامل التشغيل $lookup
- صقل النتائج باستخدام التصفية
- تقنيات التجميع المتقدمة
- تحسين الأداء
- الأسئلة الشائعة
فهم الـ 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
وتعامل مع المستندات غير المطابقة وفقًا لذلك.
س: كيف تتعامل مع الأداء مع المجموعات الضخمة؟ ج: الفهرسة ضرورية. قم بتحسين خط الأنابيب الخاص بك لتقليل المعالجة.