$project (الإسقاط)
آخر تحديث: 2026-10-09
$project (الإسقاط)
$project هو مرحلة الإسقاط: يختار الحقول أو يستبعدها أو يحسب حقولًا جديدة، معينًا كل مستند بشكلًا جديدًا. وعلى خلاف $addFields، يخرج افتراضيًا _id والحقول المدرجة صراحةً فقط: 1 يتضمن، 0 يستبعد، والتعبير ينشئ حقلًا جديدًا. استخدمه لتقليص المستندات أو إعادة تسمية الحقول أو تسطيح الكائنات المضمنة. لا يمكن خلط الإدراج والاستبعاد (باستثناء _id).
| الفئة | المراحل الأساسية |
|---|---|
| إصدار MongoDB | 1.0+ |
| لغة المثال | mongosh (الطرفية) |
📝 الصيغة
{ $project: { <field>: <1 or 0 or expression>, ... } }
⚙️ المعلمات
| إسقاط الحقول | أسماء الحقول مربوطة بـ 1 (تضمين) أو 0 (استبعاد) أو تعبير تجميع (حقل محسوب). |
|---|
القيمة المرجعة:تدفق مستندات مُسقَط
▶ مثال
نفّذ الأوامر التالية في mongosh المحلي لديك (يتطلب تشغيل mongod):
// $project: إبقاء name وحساب total
db.orders.aggregate([
{ $project: { _id: 0, name: 1, total: { $multiply: ['$price', '$qty'] } } }
])
المخرجات:
// كل مستند أصبح يحتوي الآن name وtotal فقط
{ "name": "Pen", "total": 150 }
{ "name": "Book", "total": 30 }
📌 ملاحظات
- $project قائمة بيضاء: الحقول غير المدرجة تُسقط
- لا يمكن خلط الإدراج والاستبعاد (باستثناء _id)
- المسارات النقطية مثل 'detail.price' تعيد تسمية الحقول المضمنة أو تسطّحها
🏷️ وسوم ذات صلة
💡 حالات ذات صلة
مسارات التجميع المتقدمة: التعبيرات والتحويلات المعقدة
مقدمة إلى مسارات التجميع: طريقة `aggregate` والمرحلة الأساسية
تجربة عملية: عمليات CRUD لنظام تعليقات المدونة
تدفقات التغييرات: مراقبة التغييرات في الوقت الفعلي
$facet + $bucket + البحث النصي/الجغرافي المكاني
$lookup والارتباطات مع مجموعات متعددة
📚 دروس ذات صلة
❓ الأسئلة الشائعة
Qما الفرق بين $project و $addFields؟
Aيُبقي $addFields كل الحقول الأصلية ويضيف جديدة؛ بينما يسقط $project الحقول غير المدرجة افتراضيًا، ويُستخدم لقص أو إعادة بناء شكل المستند.
Qهل يمكن لـ $project استبعاد عدة حقول دفعة واحدة؟
Aنعم، اضبطها كلها على 0، مثل { $project: { secret: 0, log: 0 } }، مع إبقاء كل حقل آخر.
Qهل يغيّر $project ترتيب الحقول؟
Aتتبع حقول المخرجات الترتيب المكتوب في الإسقاط، بغض النظر عن ترتيب المستند الأصلي.