MongoDB: مشغلات الاستعلام: دليل شامل لأكثر من 30 مشغلًا
آخر تحديث: 2026-08-26
تُعد عوامل الاستعلام جوهر استعلامات MongoDB — فإتقان أكثر من 30 عاملاً منها يكفي للتعامل مع 90% من سيناريوهات الاستعلام.
تقدم هذه الدورة نظرة عامة منهجية على استخدام جميع عوامل الاستعلام، وطرق تجميعها، وتقنيات تحسين أدائها.
1. ما ستتعلمه
- عوامل المقارنة ($eq/$ne/$gt/$lt/$gte/$lte/$in/$nin)
- العوامل المنطقية ($and/$or/$not/$nor)
- عوامل العناصر ($exists/$type)
- عوامل التشغيل الخاصة بالمصفوفات ($all/$size/$elemMatch)
- عوامل التقييم ($regex/$expr/$mod)
- تركيبة المشغلين وتأثيرها على الأداء
2. قصة حقيقية لمحلل بيانات
(1) المشكلة: تتطلب الاستعلامات المعقدة استخدام عبارات «if-else» متداخلة
ديانا هي محللة بيانات في مجال التجارة الإلكترونية، وتحتاج إلى العثور على منتجات تستوفي المعايير التالية: «السعر 100–500، المخزون > 0، العلامات تتضمن «الأكثر مبيعًا» أو «جديد»، والتقييم >= 4»:
// ❌ Counterexample:Query everything first, then filter
const allProducts = await Product.find();
const filtered = allProducts.filter(p =>
p.price >= 100 && p.price <= 500 &&
p.stock > 0 &&
(p.tags.includes('bestseller') || p.tags.includes('new')) &&
p.rating >= 4
);
// 100,000 Data Points, Return only 100 items,But after checking all of them
(2) حلول لمشغلي MongoDB
// ✅ Correct Example:A single query,Combining Operators
const products = await Product.find({
price: { $gte: 100, $lte: 500 },
stock: { $gt: 0 },
tags: { $in: ['bestseller', 'new'] },
rating: { $gte: 4 }
});
// Database-Level Filtering,1 million -> 100 items,Performance ↑1000x
graph TB
A[Query Operators] --> B[Comparison Operators<br/>$eq/$gt/$lt]
A --> C[Logical Operators<br/>$and/$or/$not]
A --> D[Element Operators<br/>$exists/$type]
A --> E[Array Operators<br/>$all/$size/$elemMatch]
A --> F[Evaluation Operator<br/>$regex/$expr/$mod]
style B fill:#d4edda
style E fill:#d4edda
3. عوامل المقارنة
نظرة عامة على المفهوم: تعتبر عوامل المقارنة الفئة الأساسية والأكثر استخدامًا من بين عوامل الاستعلام، حيث تدعم عمليات مثل المساواة، وعدم المساواة، «أكبر من»، «أصغر من»، النطاق، والمطابقة متعددة القيم. تغطي عوامل المقارنة الثمانية 90% من سيناريوهات الاستعلام اليومية، حيث يُعد $in واستعلامات النطاق (التركيبة $gt/$gte/$lt/$lte) الأكثر استخدامًا.
كيفية العمل: تعمل عوامل المقارنة على حقل واحد؛ وتقوم MongoDB بترجمتها إلى مسح للفهرس أو مسح كامل للجدول. $eq و$in هما الأكثر ملاءمةً للفهرس (حيث يدعمان المطابقات الدقيقة أو عمليات المسح متعددة القيم)؛ ويمكن لاستعلامات النطاق ($gt/$lt) أيضًا استخدام الفهارس، لكن الكفاءة تعتمد على حجم النطاق. $ne و$nin غير متوافقين مع الفهرس — لأن المستندات التي «لا تساوي قيمة معينة» قد تكون مبعثرة في جميع أنحاء الفهرس.
graph TB
A[Comparison Operators] --> B[Equivalence Class<br/>$eq / $ne]
A --> C[Scope Class<br/>$gt / $gte / $lt / $lte]
A --> D[Multi-valued types<br/>$in / $nin]
B --> B1[Index Friendliness: $eq ✅ / $ne ⚠️]
C --> C1[Index Friendliness: ✅ Range Scan]
D --> D1[Index Friendliness: $in ✅ / $nin ⚠️]
| المشغل | المعنى | ما يعادله في لغة SQL | ملائم للفهرسة | تكرار الاستخدام |
|---|---|---|---|---|
$eq |
يساوي | = value |
✅ | ⭐⭐⭐ (الافتراضي) |
$ne |
لا يساوي | != value |
⚠️ | ⭐ |
$gt |
أكبر من | > value |
✅ | ⭐⭐ |
$gte |
أكبر من أو يساوي | >= value |
✅ | ⭐⭐⭐ |
$lt |
أصغر من | < value |
✅ | ⭐⭐ |
$lte |
أقل من أو يساوي | <= value |
✅ | ⭐⭐⭐ |
$in |
مدرج في المصفوفة | IN (...) |
✅ | ⭐⭐⭐ |
$nin |
غير متضمن | NOT IN (...) |
⚠️ | ⭐ |
(1) القائمة الكاملة
| المشغل | المعنى | مثال |
|---|---|---|
$eq |
يساوي | { price: { $eq: 599 } } |
$ne |
لا يساوي | { status: { $ne: 'deleted' } } |
$gt |
أكبر من | { age: { $gt: 18 } } |
$gte |
أكبر من أو يساوي | { rating: { $gte: 4 } } |
$lt |
أصغر من | { stock: { $lt: 10 } } |
$lte |
أقل من أو يساوي | { discount: { $lte: 0.5 } } |
$in |
مدرج في المصفوفة | { category: { $in: ['A', 'B'] } } |
$nin |
غير مدرج في المصفوفة | { status: { $nin: ['deleted', 'banned'] } } |
▶ المثال 1: عوامل المقارنة في التطبيق العملي
// === Price Range ===
db.products.find({
price: { $gte: 100, $lte: 500 } // 100 <= price <= 500
});
// === Multi-value matching ===
db.products.find({
category: { $in: ['Electronics', 'Books'] }
});
// === Exclude Specific Values ===
db.users.find({
role: { $nin: ['banned', 'deleted'] }
});
الإخراج:
TEXT 📖 للعرض فقط[ { _id: ObjectId('...'), sku: 'PHONE-001', title: 'Smartphone X', price: 299.99, category: 'Electronics', stock: 50 }, { _id: ObjectId('...'), sku: 'LAPTOP-001', title: 'Laptop Pro', price: 499.99, category: 'Electronics', stock: 20 }, { _id: ObjectId('...'), sku: 'BOOK-001', title: 'MongoDB Guide', price: 149.99, category: 'Books', stock: 100 } ]
4. العوامل المنطقية
شرح المفهوم: تعمل العوامل المنطقية على دمج شروط استعلام متعددة لتنفيذ منطق AND/OR/NOT. المنطق الأكثر شيوعًا في MongoDB هو AND الضمني — { a: 1, b: 2 } يعادل { $and: [{ a: 1 }, { b: 2 }] }. يجب استخدام $and الصريح فقط عند وجود «شروط متعددة على الحقل نفسه» (على سبيل المثال، { $and: [{ price: { $gte: 100 } }, { price: { $lte: 500 } }] }).
كيفية العمل: يتطلب $and استيفاء جميع الشروط الفرعية في آن واحد؛ وسيعطي مُحسِّن MongoDB الأولوية لتنفيذ الشرط الأكثر انتقائية. يتطلب $or استيفاء أي شرط فرعي واحد؛ حيث يقوم MongoDB بتنفيذ الاستعلامات لكل شرط فرعي على حدة ثم يدمج مجموعات النتائج — مما يعني أنه من الأفضل وجود فهرس لكل شرط فرعي في $or، وإلا فسيتم تشغيل عمليات مسح كاملة متعددة للجداول.
graph TB
A[Logical Operators] --> B[Implicit AND<br/>{ a: 1, b: 2 }<br/>Most Commonly Used ⭐⭐⭐]
A --> C[$and<br/>Multiple Conditions for the Same Field]
A --> D[$or<br/>Any that satisfies ⭐⭐]
A --> E[$not<br/>Negate ⭐]
A --> F[$nor<br/>None of the conditions are met]
style B fill:#d4edda
| المشغل | المعنى | ما يعادله في لغة SQL | ملاحظات |
|---|---|---|---|
| "AND" الضمني | مفصولة بفاصلة | WHERE a=1 AND b=2 |
الترميز الأكثر شيوعًا |
$and |
"AND" صريح | WHERE (a=1 AND b=2) |
يجب استخدامه في حالة وجود شروط متعددة على الحقل نفسه |
$or |
أي شرط يستوفي | WHERE a=1 OR b=2 |
يجب أن يكون لكل شرط فرعي رقم ترتيبي |
$not |
غير متوافق | WHERE NOT (cond) |
يُستخدم غالبًا بالاقتران مع $regex |
$nor |
لم يتم استيفاء أي منها | WHERE NOT (a=1 OR b=2) |
غير مستغلة بالكامل |
(1) القائمة الكاملة
| المشغل | المعنى |
|---|---|
$and |
تم استيفاء جميع الشروط |
$or |
أي ما يستوفي |
$not |
غير راضٍ |
$nor |
لم يتم العثور على أي نتائج |
▶ المثال 2: التطبيق العملي للمشغلات المنطقية
// === Implicit $and ===
db.products.find({
category: 'Electronics',
stock: { $gt: 0 }
// equivalent to { $and: [{ category: 'Electronics' }, { stock: { $gt: 0 } }] }
});
// === Explicit $and(Multiple Conditions for the Same Field)===
db.products.find({
$and: [
{ price: { $gte: 100 } },
{ price: { $lte: 500 } }
// Must use $and,Because you cannot specify multiple conditions for the same field directly
]
});
// === $or ===
db.products.find({
$or: [
{ category: 'Electronics' },
{ tags: 'bestseller' }
]
});
// === $nor(None of them match)===
db.products.find({
$nor: [
{ category: 'Books' },
{ stock: 0 }
]
});
// Return is neither Books Categories、Items Currently in Stock
// === Nested Logic ===
db.products.find({
$and: [
{ category: 'Electronics' },
{
$or: [
{ tags: 'bestseller' },
{ rating: { $gte: 4.5 } }
]
}
]
});
الإخراج:
TEXT 📖 للعرض فقط[ { _id: ObjectId('...'), name: 'Alice', email: 'alice@example.com', username: 'alice', ... }, { _id: ObjectId('...'), name: 'Bob', email: 'bob@example.com', username: 'bob', ... } ] { acknowledged: true, matchedCount: 1, modifiedCount: 1 }
5. عوامل العناصر
شرح المفهوم: تعمل عوامل العناصر على التحقق من وجود الحقول ونوعها في المستند — حيث تحدد $exists ما إذا كان الحقل موجودًا أم لا، بينما تحدد $type نوع BSON الخاص بالحقل. هذان العاملان ضروريان لفحص جودة البيانات وتنظيف البيانات غير الصحيحة: يمكن لـ $exists تحديد المستندات التي تفتقد الحقول المطلوبة، ويمكن لـ $type تحديد الحقول ذات الأنواع غير الصحيحة (مثل تخزين price بشكل غير صحيح كـ string بدلاً من number).
كيفية العمل: يطابق $exists: true جميع المستندات التي تحتوي على الحقل المحدد (بما في ذلك المستندات التي تكون فيها قيمة الحقل فارغة)، بينما يطابق $exists: false المستندات التي لا تحتوي على هذا الحقل. تقوم $type بالمطابقة استنادًا إلى رموز أنواع BSON أو أسماء الأنواع، وتدعم تنسيقات المصفوفات (على سبيل المثال، { price: { $type: ["number", "decimal"] } } تتطابق مع Double أو Decimal128).
| المشغل | المعنى | السيناريوهات النموذجية |
|---|---|---|
$exists: true |
الحقل موجود | البحث عن المنتجات التي تحتوي على حقل «الخصم» |
$exists: false |
الحقل غير موجود | البحث عن المستخدمين الذين تفتقد عناوين بريدهم الإلكتروني |
$type: "string" |
نوع الحقل هو سلسلة نصية | البحث عن المستندات التي تم فيها تخزين حقل "price" بشكل خاطئ كسلسلة نصية |
$type: ["number", "decimal"] |
أحد الأنواع المتعددة | البحث عن المستندات التي يكون فيها price من أي نوع رقمي |
(1) $exists تتحقق من وجود حقل ما
// === Field exists ===
db.products.find({ discount: { $exists: true } });
// Have discount Products in the Field
// === Field does not exist ===
db.users.find({ lastLoginAt: { $exists: false } });
// Users who have never logged in
// === In conjunction with other conditions ===
db.products.find({
discount: { $exists: true, $ne: null }
});
// Have discount Let's not worry about that for now null
(2) $type: التحقق من نوع الحقل
// === Type Code Reference ===
// 1: Double, 2: String, 3: Object, 4: Array
// 5: Binary, 7: ObjectId, 8: Boolean, 9: Date
// 10: Null, 16: Int32, 18: Long, 19: Decimal128
// === String Type ===
db.products.find({ sku: { $type: "string" } });
// === Numeric Types(Various)===
db.products.find({ price: { $type: ["number", "decimal"] } });
// Double or Decimal128
// === Practical Applications:Identify fields with type errors ===
db.products.find({ price: { $type: "string" } });
// Find price Documents in Which Fields Were Incorrectly Stored as Strings(Frequently Asked Questions About Data Migration)
▶ المثال 3: استخدامات عوامل العناصر
// === Find "dirty" data with missing fields ===
db.users.find({
$or: [
{ email: { $exists: false } },
{ username: { $exists: false } }
]
});
// === Type Correction ===
db.products.find({ price: { $type: "string" } }).forEach(doc => {
db.products.updateOne(
{ _id: doc._id },
{ $set: { price: NumberDecimal(doc.price) } }
);
});
الإخراج:
TEXT 📖 للعرض فقط[ { _id: ObjectId('...'), name: 'Alice', courses: [{ name: 'Math', score: 92 }, { name: 'Physics', score: 88 }] } ]
6. عوامل المصفوفات
شرح المفهوم: تعتبر عوامل المصفوفات الفئة الأكثر تميزًا بين عوامل الاستعلام في MongoDB، وهي مصممة خصيصًا للتعامل مع حقول المصفوفات — حيث تتطابق $all مع المصفوفات التي تحتوي على جميع العناصر المحددة، وتتطابق $size مع المصفوفات ذات الطول المحدد، بينما تتطابق $elemMatch مع عنصر واحد في مصفوفة يستوفي عدة شروط في آن واحد. ومن بين هذه العوامل، يُعد $elemMatch أكثر عوامل المصفوفات عرضةً للخطأ، كما أنه الأكثر أهميةً.
كيفية العمل: بشكل افتراضي، تستخدم استعلامات المصفوفات في MongoDB مبدأ «مطابقة أي عنصر» — حيث يطابق { tags: "5g" } المستندات التي تحتوي المصفوفة tags فيها على «5g». ومع ذلك، في الاستعلامات متعددة الشروط، قد يطابق { "reviews.rating": { $gte: 4 }, "reviews.content": /good/ } مستندات تحتوي على عناصر مصفوفة مختلفة (مثل أن يكون أحد التعليقات ذو تقييم عالٍ، بينما يحتوي تعليق آخر على كلمة رئيسية). يحل $elemMatch هذه المشكلة — فهو يضمن أن نفس عنصر المصفوفة يستوفي جميع الشروط في آن واحد.
graph TB
A[Array Operators] --> B[$all<br/>Includes all specified elements]
A --> C[$size<br/>Exact Match for Array Length]
A --> D[$elemMatch<br/>Multi-Condition Matching for the Same Element<br/>⭐ Most important]
D --> D1[Dot notation<br/>Different elements may match]
D --> D2[$elemMatch<br/>The same element must match]
style D fill:#d4edda
style D2 fill:#d4edda
| المشغل | المعنى | الصيغة | ملاحظات |
|---|---|---|---|
$all |
يشمل جميع العناصر المحددة | { tags: { $all: ["5g", "amoled"] } } |
الترتيب غير مهم |
$size |
مطابقة تامة لطول المصفوفة | { tags: { $size: 3 } } |
لا يدعم النطاقات؛ استخدم $expr |
$elemMatch |
مطابقة الشروط المتعددة لنفس العنصر | { reviews: { $elemMatch: { ... } } } |
التمييز عن الترميز النقطي |
(1) $all تتطابق مع جميع العناصر
// === Must include all specified elements(Order does not matter)===
db.products.find({ tags: { $all: ['5g', 'amoled'] } });
// Includes both 5g and amoled Products
// === equivalent to $and ===
db.products.find({
$and: [
{ tags: '5g' },
{ tags: 'amoled' }
]
});
(2) يتطابق $size مع طول المصفوفة
// === Exact Match for Array Length ===
db.products.find({ tags: { $size: 3 } });
// The number of tags is exactly 3
// === Unsupported Ranges,Required $expr ===
db.products.find({
$expr: { $gt: [{ $size: "$tags" }, 3] }
});
// Number of tags > 3
(3) $elemMatch: مطابقة العنصر (مفتاح!)
// === Scene:Check the ratings in the reviews >= 4 and contains the keyword "good" Comments on ===
db.products.find({
reviews: {
$elemMatch: {
rating: { $gte: 4 },
content: /good/i
}
}
});
// ✅ Correct:A single comment meets both conditions at the same time
// === Counterexample:Do not use $elemMatch ===
db.products.find({
"reviews.rating": { $gte: 4 },
"reviews.content": /good/i
});
// ⚠️ Error:May match different comments(One comment, high rating,Another post containing the keyword)
▶ المثال 4: استخدام عوامل المصفوفات عمليًّا
// === Scene:Student Course Registration System ===
db.students.insertMany([
{
name: "Alice",
courses: [
{ name: "Math", score: 85 },
{ name: "Physics", score: 92 },
{ name: "Chemistry", score: 78 }
]
},
// ...
]);
// Search:Selected Math And the score >= 90 students
db.students.find({
courses: {
$elemMatch: { name: "Math", score: { $gte: 90 } }
}
});
// Search:Selected 3 Students enrolled in courses at the undergraduate level or above
db.students.find({
$expr: { $gte: [{ $size: "$courses" }, 3] }
});
// Search:All course grades are >= 80 students
db.students.find({
courses: {
$not: {
$elemMatch: { score: { $lt: 80 } }
}
}
});
الإخراج:
TEXT 📖 للعرض فقط{ acknowledged: true, insertedCount: 1 } [ { _id: ObjectId('...'), name: 'Bob', courses: [{ name: 'Math', score: 95 }, { name: 'Chemistry', score: 88 }] } ]
7. عوامل التقييم
شرح المفهوم: توفر عوامل التقييم إمكانيات استعلام أكثر مرونة — حيث يدعم $regex مطابقة التعبيرات النمطية (البحث غير الدقيق)، ويدعم $expr المقارنات بين الحقول باستخدام تعبيرات التجميع، ويدعم $mod عمليات القسمة على القاسم. ورغم أن هذه العوامل قوية، إلا أن أداءها ضعيف، لذا ينبغي استخدامها «كملاذ أخير» — وينبغي إعطاء الأولوية لطرق الاستعلام الملائمة للفهرسة.
كيفية العمل: $regex بشكل افتراضي، لا يتم دعم الفهرسة (باستثناء الاستعلامات المرتبطة بالبادئة ^pattern)، لذا يجب مسح جميع المستندات لإجراء مطابقة التعبيرات النمطية. $expr عند استخدام تعبيرات مسار التجميع، يتم حساب نتيجة التعبير لكل مستند قبل المقارنة، مما يؤدي أيضًا إلى ضعف الأداء. ولا ينبغي استخدام أي من هذين الخيارين كشرط أساسي للاستعلامات عالية التكرار.
| المشغل | المعنى | ملائم للفهرسة | الأداء | حالات الاستخدام |
|---|---|---|---|---|
$regex |
مطابقة التعبيرات النمطية | ⚠️ مطابقة البادئة فقط | بطيئة | البحث التقريبي |
$expr |
التعبير التجميعي | ❌ | بطيء جدًا | المقارنة بين الحقول |
$mod |
عملية القسمة على | ❌ | بطيئة | التصفية باستخدام القسمة على |
(1) $regex التعبير النمطي
// === Simple Regular Expressions ===
db.products.find({ title: /^iPhone/ });
// Title: "iPhone" Introduction
// === Case-insensitive ===
db.products.find({ title: { $regex: 'phone', $options: 'i' } });
// === Multimode Matching ===
db.products.find({
title: { $regex: 'phone|mobile', $options: 'i' }
});
// === Performance Optimization:Regular Expression Anchoring(Avoid ^.* Wildcard)===
// ✅ Fast: db.products.find({ title: /^iPhone/ })
// ⚠️ Slow: db.products.find({ title: /iPhone/ })
(2) يستخدم $expr تعبير تجميعي
// === Comparison Between Fields ===
db.products.find({
$expr: { $gt: ["$discount", "$price"] }
});
// discount > price(Outlier Data)
// === Comparing Array Lengths ===
db.products.find({
$expr: { $gte: [{ $size: "$tags" }, 5] }
});
// === String Operations ===
db.products.find({
$expr: { $eq: [{ $substr: ["$title", 0, 5] }, "Hello"] }
});
(3) $mod: القسمة على
// === Field-value pairs N Removing the Mold ===
db.products.find({ price: { $mod: [100, 0] } });
// The price can be 100 Divisibility by an Integer
// === Price Comparison 100 Removing the Mold = 50 ===
db.products.find({ price: { $mod: [100, 50] } });
8. التدريب العملي الشامل
شرح المفهوم: في سيناريوهات الأعمال الواقعية، نادرًا ما تستخدم الاستعلامات عاملًا واحدًا فقط — فهي عادةً ما تكون مجموعات من عوامل متعددة. والمبادئ الأساسية للاستعلامات المركبة هي: وضع الشروط الأكثر انتقائية أولاً (لتقليل كمية البيانات التي يتم فحصها بواسطة الشروط اللاحقة)، وإنشاء فهارس على الحقول في جميع جمل $or، وتجنب استخدام تعبيرات التجميع المعقدة في $expr.
مبادئ تحسين الأداء:
- تتمتع استعلامات القيم المتطابقة (
$eq/$in) بأعلى درجة من الانتقائية، وينبغي وضعها في مقدمة المرشح. - استعلامات النطاق (
$gt/$lt) هي ثاني أكثر الاستعلامات انتقائية، وينبغي وضعها بعد شروط المساواة. - يجب أن يكون لكل بند من بنود
$orدعم فهرس مستقل $regexلا يمكن استخدام الفهارس إلا في عمليات البحث القائمة على البادئة؛ أما في جميع الحالات الأخرى، فيتم إجراء مسح كامل للجدول.$exprأداءه هو الأسوأ؛ استخدمه كملاذ أخير
graph TB
A[Comprehensive Query Optimization] --> B[1. Equivalence Filtering<br/>Highest selectivity]
A --> C[2. Range Filtering<br/>Selectivity is secondary]
A --> D[3. Logic Combinations<br/>$and/$or]
A --> E[4. Sort + Pagination<br/>sort + limit]
B --> B1[{ category: 'E' }<br/>Index Scan]
C --> C1[{ price: { $gte: 100 } }<br/>Range Scan]
D --> D1[Combination of Multiple Conditions<br/>Merge Result Sets]
E --> E1[Index Sorting<br/>Avoid Memory Sorting]
style B1 fill:#d4edda
| استراتيجية التحسين | طريقة الاستعلام | متطلبات الفهرس | الأداء |
|---|---|---|---|
| الأمثل | الفرز حسب القيمة المتساوية + الفرز حسب الفهرس | الفهرس المركب | O(log N) |
| جيد | القيمة المتساوية + النطاق + المؤشر | المؤشر المركب | O(log N + K) |
| عام | $or + فهارس كل جملة | فهارس مستقلة متعددة | O(K * log N) |
| ضعيف | تثبيت البادئة باستخدام $regex | فهرس البادئة | O(log N + K) |
| أسوأ الحالات | $expr / الفرز غير المفهرس | لا شيء | O(N log N) |
(1) أمثلة على الاستعلامات المعقدة
// === Scene:Advanced Search for E-commerce ===
// Price 100-1000、Electronics or Computers、Inventory > 0、
// Tags include 'bestseller' or 'new'、Rating >= 4、Have discount
db.products.find({
$and: [
{ price: { $gte: 100, $lte: 1000 } },
{
$or: [
{ category: 'Electronics' },
{ category: 'Computers' }
]
},
{ stock: { $gt: 0 } },
{ tags: { $in: ['bestseller', 'new'] } },
{ rating: { $gte: 4 } },
{ discount: { $exists: true, $ne: null } }
]
});
▶ المثال 5: مقارنة أداء المشغلين
// === Performance Testing:100 10,000 Documents ===
// ❌ Slow: Unindexed fields + $exists
db.users.find({ lastLoginAt: { $exists: true } });
// ~500ms(Full Table Scan)
// ✅ Fast: Index Field + Range Query
db.users.find({ age: { $gte: 18, $lt: 30 } });
// ~5ms(Index Scan)
// ❌ Slow: Regular expression not anchored
db.products.find({ title: /phone/i });
// ~300ms(Full Table Scan + Regular Expression Matching)
// ✅ Fast: Regular Expression Anchoring
db.products.find({ title: /^iPhone/ });
// ~10ms(Prefix Index)
الإخراج:
TEXT 📖 للعرض فقط// Performance Comparison Results: // $exists without index: ~500ms (Full Table Scan) // Range query with index: ~5ms (Index Scan) // Unanchored regex: ~300ms (Full Table Scan + Pattern Matching) // Anchored regex: ~10ms (Prefix Index)
❓ أسئلة شائعة
{ field: { $in: [A, B] } } مكافئة لـ { $or: [{ field: A }, { field: B }] }. وكلاهما لهما نفس الأداء، لكن يُنصح باستخدام $in لأنها أكثر إيجازًا.{ "a.b": 1, "a.c": 2 } مع عناصر مختلفة من المصفوفة بالنسبة إلى b و c؛ أما { a: { $elemMatch: { b: 1, c: 2 } } } فتتطلب أن يستوفي العنصر نفسه كلا الشرطين في آن واحد.^pattern). وتتطلب التعبيرات النمطية غير المثبتة مسح جميع المستندات لإجراء عملية المطابقة، مما يؤدي إلى ضعف الأداء.📖 ملخص
- عوامل المقارنة: $eq/$ne/$gt/$lt/$gte/$lte/$in/$nin
- العوامل المنطقية: $and (ضمني) / $or / $not / $nor
- عوامل العناصر: $exists (وجود الحقل) / $type (نوع الحقل)
- عوامل المصفوفات: $all (تحتوي على كل العناصر) / $size (الطول) / $elemMatch (تطابق عنصرًا)
- عوامل التقييم: $regex (التعبير النمطي) / $expr (التعبير التجميعي) / $mod (الجزء المتبقي)
- تحسين الأداء: استعلامات الحقول المفهرسة / بادئات التعبيرات النمطية / تجنب استخدام $expr
📝 تمارين
- السؤال الأساسي (⭐): استعلام عن منتجات «إلكترونيات» التي تتراوح أسعارها بين 100 و500 ويكون رصيدها المخزوني أكبر من 0.
- السؤال الأساسي (⭐): استخدم $in للبحث عن المنتجات عبر فئات متعددة (الإلكترونيات/الكتب/الملابس).
- مشكلة متقدمة (⭐⭐): استخدم $elemMatch للعثور على المنتجات في التعليقات التي «تبلغ تقييمها 4 أو أكثر وتحتوي على الكلمة المفتاحية "good"».
- مشكلة متقدمة (⭐⭐): استخدم $expr للبحث عن المنتجات التي تحتوي على أكثر من 3 علامات وتقييم 4 أو أعلى.
- سؤال التحدي (⭐⭐⭐): قم بإنشاء استعلامات معقدة (تتألف من 5 عوامل تشغيل أو أكثر)، بما في ذلك عوامل التشغيل AND/OR/NOT، و$elemMatch، و$regex، لاختبار الاختلافات في الأداء.