$facet (تجميع متعدد الأوجه)
آخر تحديث: 2026-10-09
$facet (تجميع متعدد الأوجه)
يشغّل $facet عدة خطوط أنابيب فرعية بالتوازي داخل مرحلة واحدة، كلٌّ منها يعالج نفس مستندات الإدخال، دامجًا النتائج كحقول: { name: [ results ] }. احصل على إحصائيات ملخصة وقوائم تفصيلية وأعلى-N في طلب واحد بدلًا من عدة جولات. خطوط الأنابيب الفرعية مستقلة.
| الفئة | التجميع والنافذة |
|---|---|
| إصدار MongoDB | 1.0+ |
| لغة المثال | mongosh (الطرفية) |
📝 الصيغة
{ $facet: { <outputField1>: [ <sub-pipeline1> ], <outputField2>: [ <sub-pipeline2> ] } }
⚙️ المعلمات
| خط أنابيب فرعي | أسماء الحقول مربوطة بمصفوفات خطوط أنابيب فرعية، يعالج كل منها الإدخال على حدة. |
|---|
القيمة المرجعة:مستند واحد تحمل حقوله مصفوفة نتائج كل خط أنابيب فرعي
▶ مثال
نفّذ الأوامر التالية في mongosh المحلي لديك (يتطلب تشغيل mongod):
// $facet: تحليل الحالة بالإضافة إلى أعلى 5 حسب المبلغ
db.orders.aggregate([
{ $facet: {
byStatus: [{ $group: { _id: '$status', n: { $sum: 1 } } }],
top5: [{ $sort: { amount: -1 } }, { $limit: 5 }]
} }
])
المخرجات:
{ "byStatus": [ { "_id": "A", "n": 20 } ], "top5": [ { ... } ] }
📌 ملاحظات
- لا يمكن لخطوط الأنابيب الفرعية احتواء مراحل مثل $out أو $merge أو $facet
- خطوط الأنابيب الفرعية مستقلة، كلٌّ يرى الإدخال الكامل
- المخرج مستند واحد مع مصفوفة لكل اسم خط أنابيب فرعي
🏷️ وسوم ذات صلة
💡 حالات ذات صلة
مسارات التجميع المتقدمة: التعبيرات والتحويلات المعقدة
تجربة عملية: عمليات CRUD لنظام تعليقات المدونة
$facet + $bucket + البحث النصي/الجغرافي المكاني
$lookup والارتباطات مع مجموعات متعددة
📚 دروس ذات صلة
❓ الأسئلة الشائعة
Qهل يمكن لخطوط الأنابيب الفرعية الفرز داخل $facet؟
Aنعم، يمكن لخطوط الأنابيب الفرعية استخدام مراحل عادية مثل $sort و $limit.
Qهل $facet أسرع من استدعاءات aggregate متعددة؟
Aعادة نعم: تمريرة واحدة تخدم عدة تجميعات، قاطعةً الإدخال/الإخراج والجولات.
Qما شكل مخرجات $facet؟
Aمستند واحد؛ كل اسم خط أنابيب فرعي يقابل مصفوفة نتائج.