$bucket (المجموعات)
آخر تحديث: 2026-10-09
$bucket (المجموعات)
يجمع $bucket المستندات في مجموعات محددة بمصفوفة حدود تصاعدية، مصدرًا مستندًا واحدًا { _id: lowerBound, count: N } لكل مجموعة، مع مُراكمات مخرجات اختيارية. المستندات خارج كل الحدود تسقط في المجموعة الافتراضية. مثالي للمدرجات التكرارية وإحصائيات النطاق.
| الفئة | التجميع والنافذة |
|---|---|
| إصدار MongoDB | 1.0+ |
| لغة المثال | mongosh (الطرفية) |
📝 الصيغة
{ $bucket: { groupBy: <expression>, boundaries: [ <lowerBound>, ... ], default: <value>, output: { <field>: <accumulator> } } }
⚙️ المعلمات
| groupBy | تعبير يحدد الحاوية (bucket) التي يقع فيها المستند. |
|---|---|
| boundaries | مصفوفة حدود الحاويات بترتيب تصاعدي، بقيمتين على الأقل. |
| default | اسم الحاوية (bucket) للمستندات خارج كل الحدود؛ والمستندات المُغفَلة تُسقَط. |
| output | مجمِّعات تُحسب لكل حاوية (bucket)، مثل $avg أو $sum. |
القيمة المرجعة:مستند واحد { _id, count, ... } لكل حاوية (bucket)
▶ مثال
نفّذ الأوامر التالية في mongosh المحلي لديك (يتطلب تشغيل mongod):
// $bucket: تقسيم الدرجات إلى نطاقات، بمتوسط لكل مجموعة
db.scores.aggregate([
{ $bucket: {
groupBy: '$score',
boundaries: [0, 60, 80, 100],
default: 'other',
output: { avg: { $avg: '$score' } }
} }
])
المخرجات:
{ "_id": 0, "count": 12, "avg": 35.5 }
{ "_id": 60, "count": 20, "avg": 71.2 }
📌 ملاحظات
- يجب أن تكون boundaries تصاعدية مع قيمتين على الأقل
- النطاقات نصف مفتوحة: تقع القيم في [boundaries[i], boundaries[i+1])
- المستندات خارج النطاق تذهب إلى default، أو تُسقط إذا حُذف
🏷️ وسوم ذات صلة
💡 حالات ذات صلة
📚 دروس ذات صلة
❓ الأسئلة الشائعة
Qما الفرق بين $bucket و $bucketAuto؟
Aيأخذ $bucket حدودًا صريحة؛ بينما يقسم $bucketAuto المجموعات تلقائيًا لأعداد متساوية.
Qهل النطاقات نصف مفتوحة؟
Aنعم: تقع القيم في [boundaries[i], boundaries[i+1])؛ الحد الأخير حد علوي مستبعد.
Qهل يمكن حذف المجموعة الافتراضية؟
Aنعم؛ تُسقط المستندات خارج كل المجموعات عندئذ.