$unwind (تفكيك المصفوفة)
آخر تحديث: 2026-10-09
$unwind (تفكيك المصفوفة)
يفكك $unwind حقل مصفوفة، مصدرًا مستندًا واحدًا لكل عنصر مع نسخ كل الحقول الأخرى. استخدمه لتسطيح المصفوفات قبل التجميع أو الإحصائيات أو الربط. تُسقط المستندات ذات المصفوفات الفارغة أو المفقودة أو null افتراضيًا؛ ويُبقيها preserveNullAndEmptyArrays ويكشف includeArrayIndex فهرس العنصر. يؤدي التفكيك إلى مضاعفة عدد المستندات، لذا وازن المراحل اللاحقة.
| الفئة | المراحل الأساسية |
|---|---|
| إصدار MongoDB | 1.0+ |
| لغة المثال | mongosh (الطرفية) |
📝 الصيغة
{ $unwind: { path: "$arrayField", preserveNullAndEmptyArrays: <bool>, includeArrayIndex: "<indexField>" } }
⚙️ المعلمات
| path | مسار حقل المصفوفة المراد تفكيكه، مسبوقًا بـ $. |
|---|---|
| preserveNullAndEmptyArrays | عندما تكون true، تُبقي المستندات ذات المصفوفات الفارغة أو المفقودة أو null. |
| includeArrayIndex | يُخرج فهرس كل عنصر في المصفوفة الأصلية إلى هذا الحقل. |
القيمة المرجعة:تدفق مستندات مُسطَّح (مستند واحد لكل عنصر مصفوفة)
▶ مثال
نفّذ الأوامر التالية في mongosh المحلي لديك (يتطلب تشغيل mongod):
// $unwind: تفكيك مصفوفة tags
db.inventory.aggregate([
{ $unwind: { path: '$tags', includeArrayIndex: 'idx' } }
])
المخرجات:
{ "_id": 1, "item": "Pen", "tags": "A", "idx": 0 }
{ "_id": 1, "item": "Pen", "tags": "B", "idx": 1 }
📌 ملاحظات
- تُسقط المستندات ذات المصفوفات الفارغة أو المفقودة أو null ما لم يُضبط preserveNullAndEmptyArrays
- يكشف includeArrayIndex فهرس العنصر الأصلي
- زاوج $unwind مع $group أو $lookup لإحصائيات أو ربط لكل عنصر
🏷️ وسوم ذات صلة
💡 حالات ذات صلة
مسارات التجميع المتقدمة: التعبيرات والتحويلات المعقدة
تجربة عملية: عمليات CRUD لنظام تعليقات المدونة
$lookup والارتباطات مع مجموعات متعددة
📚 دروس ذات صلة
❓ الأسئلة الشائعة
Qهل تتشارك المستندات الناتجة عن $unwind في نفس _id؟
Aنعم. يُنسخ _id وكل الحقول الأخرى حرفيًا؛ ويصبح حقل المصفوفة عنصرًا واحدًا فقط.
Qماذا يحدث عندما يصادف $unwind مصفوفة فارغة؟
Aيُسقط المستند افتراضيًا؛ اضبط preserveNullAndEmptyArrays إلى true لإبقائه.
Qهل يمكن تفكيك عدة حقول مصفوفة دفعة واحدة؟
Aيتعامل $unwind الواحد مع مصفوفة واحدة. سلسل عدة مراحل $unwind لعدة مصفوفات، وهو ما يعطي جداءً ديكارتيًا.