$where (تعبير جافاسكربت)
آخر تحديث: 2026-10-09
$where (تعبير جافاسكربت)
يقيّم $where تعبير جافاسكربت كمسند استعلام. `{ $where: 'this.credits == this.debits' }`. يُنفَّذ من جانب الخادم، وهو بطيء ولا يمكنه استخدام الفهارس، ويوصي MongoDB باستخدام $expr بدلًا منه. استخدمه فقط عندما لا يستطيع $expr التعبير عن المنطق (مثل دوال جافاسكربت مخصصة) واحمِ نفسك من الحقن.
| الفئة | العنصر والتقييم |
|---|---|
| إصدار MongoDB | 1.0+ |
| لغة المثال | mongosh (الطرفية) |
📝 الصيغة
{ $where: <JavaScript expression> }
⚙️ المعلمات
| تعبير JS | تعبير JavaScript يُرجع قيمة منطقية؛ ويشير this إلى المستند الحالي. |
|---|
القيمة المرجعة:مؤشر المستندات المطابقة
▶ مثال
نفّذ الأوامر التالية في mongosh المحلي لديك (يتطلب تشغيل mongod):
// $where: السجلات التي تساوي فيها الاعتمادات الخصوم (جافاسكربت)
db.accounts.find({ $where: 'this.credits == this.debits' })
// الموصى به: $expr أسرع
db.accounts.find({ $expr: { $eq: ['$credits', '$debits'] } })
المخرجات:
// كلاهما يُرجع النتيجة نفسها، لكن $expr أداء أفضل
📌 ملاحظات
- يشغّل جافاسكربت من جانب الخادم، لا يمكنه استخدام الفهارس، أداء ضعيف
- فضّل $expr (MongoDB 3.6+)
- خطر الحقن: لا تقم أبدًا بدمج مدخلات المستخدم في $where
🏷️ وسوم ذات صلة
💡 حالات ذات صلة
مزيد من الحالات العملية قريبًا.
📚 دروس ذات صلة
❓ الأسئلة الشائعة
Qلماذا $where بطيء؟
Aيقيّم جافاسكربت لكل مستند من جانب الخادم دون دعم فهرس.
Qكيف أختار بين $where و $expr؟
Aفضّل $expr: أداء أفضل ودعم للفهارس؛ استخدم $where فقط لمنطق جافاسكربت مخصص.
Qهل لـ $where مخاطر أمنية؟
Aنعم. دمج مدخلات المستخدم في السلسلة يتيح الحقن؛ قم بترميز المعاملات أو انتقل إلى $expr.