forEach() (التكرار على مؤشر)
آخر تحديث: 2026-10-09
forEach() (التكرار على مؤشر)
تشغّل forEach() استدعاءً رجعيًا على كل مستند في مؤشر، مثل `db.users.find().forEach(function(doc) { print(doc.name) })`. تعالج أثناء السحب دون تخزين كل شيء في الذاكرة مثل toArray()، مما يجعلها الخيار الصديق للتدفق لمجموعات النتائج الكبيرة. يمكن للاستدعاء الرجعي الجمع أو العدّ أو التسجيل — وهي عنصر أساسي للوظائف الجماعية.
| الفئة | المؤشر |
|---|---|
| إصدار MongoDB | 1.0+ |
| لغة المثال | mongosh (الطرفية) |
📝 الصيغة
db.<collection>.find(<filter>).forEach(<callback>)
⚙️ المعلمات
| دالة الاستدعاء | دالة تستقبل كل مستند، مثل function(doc) { print(doc.name) }. |
|---|
القيمة المرجعة:undefined (تُنفَّذ عمليات الاستدعاء على تدفق مستندات الخادم).
▶ مثال
نفّذ الأوامر التالية في mongosh المحلي لديك (يتطلب تشغيل mongod):
// forEach: عدّ البالغين أثناء التدفق
let n = 0
db.users.find({ age: { $gte: 18 } }).forEach(doc => {
n++
})
print(n)
المخرجات:
Alice
Bob
Processed: 2
📌 ملاحظات
- الاستدعاءات الرجعية تعمل على العميل، مرة لكل مستند
- الذاكرة تبقى ثابتة — مثالية لمجموعات النتائج الكبيرة
- لا تعدّل المجموعة التي تكرار عليها داخل الاستدعاء الرجعي؛ فقد تستمر الحلقة بلا نهاية
🏷️ وسوم ذات صلة
💡 حالات ذات صلة
📚 دروس ذات صلة
❓ الأسئلة الشائعة
Qأيهما يستهلك ذاكرة أقل، forEach أم toArray؟
Aتعالج forEach() أثناء السحب بذاكرة منخفضة؛ بينما تُحمّل toArray() كل شيء في الذاكرة، وهو أغلى مع المجموعات الكبيرة.
Qهل يمكن للاستدعاء الرجعي في forEach تعديل المستندات؟
Aيتلقى الاستدعاء نسخة — لا تبقى التعديلات؛ استدعِ عمليات تحديث داخل الاستدعاء لكتابة التغييرات.
Qهل يمكنني الخروج مبكرًا من forEach؟
Aلا تملك forEach آلية break؛ للخروج الشرطي كرِّر يدويًا بـ next() أو اقتطع بـ limit() أولًا.