$setWindowFields (تعيين حقول النافذة)
آخر تحديث: 2026-10-09
$setWindowFields (تعيين حقول النافذة)
يُجري $setWindowFields حسابات النافذة — الرتب والمتوسطات المتحركة والمجاميع الجارية — عبر أقسام ويكتب النتائج إلى كل مستند. حدد حقول المخرجات بعوامل النافذة (مثل $rank و $denseRank أو المُراكمات) وترتيب sortBy ونطاق نافذة اختياري. فكّر في دوال النافذة في SQL.
| الفئة | التجميع والنافذة |
|---|---|
| إصدار MongoDB | 5.0+ |
| لغة المثال | mongosh (الطرفية) |
📝 الصيغة
{ $setWindowFields: { partitionBy: <expression>, sortBy: { <field>: <1 or -1> }, output: { <field>: { <windowOperator>: ..., window: { documents: [...], range: [...] } } } } }
⚙️ المعلمات
| partitionBy | تعبير التقسيم؛ وعند إغفاله تُشكّل كل المستندات قسمًا واحدًا. |
|---|---|
| sortBy | ترتيب الفرز داخل الأقسام، والذي يحدد ترتيب حساب النوافذ. |
| output | حقول الإخراج مع تعريفات معاملات النوافذ الخاصة بها. |
القيمة المرجعة:تدفق مستندات مع إضافة حقول محسوبة بالنوافذ
▶ مثال
نفّذ الأوامر التالية في mongosh المحلي لديك (يتطلب تشغيل mongod):
// $setWindowFields: المجموع الجاري لكل منطقة
db.sales.aggregate([
{ $setWindowFields: {
partitionBy: '$region',
sortBy: { date: 1 },
output: {
runningTotal: { $sum: '$amount', window: { documents: ['unbounded', 'current'] } }
}
} }
])
المخرجات:
// كل عملية بيع تكتسب مجموعًا جاريًا
{ "region": "EAST", "date": "2024-01-02", "amount": 30, "runningTotal": 30 }
📌 ملاحظات
- حقل مخرج واحد على الأقل مطلوب؛ يحرك sortBy وعوامل النافذة ترتيب الحساب
- تُعبَّر نطاقات النافذة عبر documents أو range
- دون partitionBy يكون التدفق كله قسمًا واحدًا
🏷️ وسوم ذات صلة
💡 حالات ذات صلة
مسارات التجميع المتقدمة: التعبيرات والتحويلات المعقدة
مقدمة إلى مسارات التجميع: طريقة `aggregate` والمرحلة الأساسية
📚 دروس ذات صلة
❓ الأسئلة الشائعة
Qما الفرق بين $setWindowFields و $group؟
Aيطوي $group مجموعة في مستند واحد؛ بينما يُبقي $setWindowFields كل مستند ويكتب نتائج النافذة عليه.
Qهل يمكنه حساب متوسط متحرك؟
Aنعم، اضبط النافذة من المستندات السبعة السابقة إلى الحالي واستخدم مُراكم $avg.
Qكيف أكتب نطاق نافذة؟
Aمثل { documents: ['unbounded', 'current'] } الذي يمتد من بداية القسم إلى المستند الحالي؛ ويعرّف range فاصلًا قيميًا.