aggregate() (خط أنابيب التجميع)
آخر تحديث: 2026-10-09
aggregate() (خط أنابيب التجميع)
تشغّل aggregate() خط أنابيب متعدد المراحل يجمع المستندات ويحسبها ويعيد تشكيلها، مثل `db.users.aggregate([{ $group: { _id: '$city', total: { $sum: 1 } } }])`. تحوّل المراحل مثل $match و $group و $sort و $project البيانات بالتتابع. وهي أقوى بكثير من find()، والخيار الأول للتقارير والجداول المحورية. يعمل خط الأنابيب على الخادم ويُعيد مؤشرًا (أو نتائج مباشرة).
| الفئة | القراءة |
|---|---|
| إصدار MongoDB | 1.0+ |
| لغة المثال | mongosh (الطرفية) |
📝 الصيغة
db.<collection>.aggregate(<pipeline>, { allowDiskUse: <bool> })
⚙️ المعلمات
| مصفوفة المراحل | مصفوفة مراحل خط الأنابيب، مثل [{$match: {...}}, {$group: {...}}]. |
|---|---|
| allowDiskUse | اختياري. true يسمح بتفريغ النتائج الوسيطة التي تتجاوز 100MB إلى القرص. |
القيمة المرجعة:مؤشر على نتائج التجميع؛ فارغ عندما يكتب $out/$merge إلى مجموعة.
▶ مثال
نفّذ الأوامر التالية في mongosh المحلي لديك (يتطلب تشغيل mongod):
// aggregate: عدّ المستخدمين مجمّعين حسب المدينة
const result = db.users.aggregate([
{ $group: { _id: '$address.city', total: { $sum: 1 } } },
{ $sort: { total: -1 } }
])
result.toArray()
المخرجات:
[
{ _id: 'Beijing', total: 12 },
{ _id: 'Shanghai', total: 8 }
]
📌 ملاحظات
- ترتيب المراحل مهم — ضع $match مبكرًا للتصفية في أقرب وقت ممكن
- تبلغ المراحل حد الذاكرة الافتراضي 100 ميجابايت؛ تجاوزه بـ allowDiskUse: true
- أشر إلى الحقول الأصلية داخل _id الخاص بـ $group ببادئة $، مثل '$age'
🏷️ وسوم ذات صلة
💡 حالات ذات صلة
📚 دروس ذات صلة
❓ الأسئلة الشائعة
Qما الفرق بين aggregate و find؟
Afind() تستعلم وتعرض فقط؛ بينما aggregate() يمكنها التجميع والعدّ والجمع والربط — وهي مبنية للتقارير.
Qماذا لو تجاوز التجميع حد الذاكرة؟
Aمرّر {allowDiskUse: true} لتفريغ النتائج الوسيطة إلى القرص، أو حسّن الأداء بـ $match مبكر.
Qكيف أستهلك نتائج التجميع؟
Aتُعيد مؤشرًا — استدعِ .toArray() أو كرِّر عليه؛ مع $out يعود المؤشر فارغًا إذ تستقر النتائج في مجموعة.