يرتب MongoDB نتائج الاستعلام باستخدام sort ويقسم الصفحات باستخدام limit و skip — مع وضعها على منحنى find. معاً يتعاملان مع ترتيب وإرجاع صفحات البيانات، وهو أمر ضروري لعرض النتائج.
يرتب MongoDB نتائج الاستعلام باستخدام sort ويقسم الصفحات باستخدام limit و skip — مع وضعها على منحنى find. معاً يتعاملان مع ترتيب وإرجاع صفحات البيانات، وهو أمر ضروري لعرض النتائج.
db.users.find().sort({ age: 1 }); // ascending by age (1 = asc)
db.users.find().sort({ age: -1 }); // descending (-1 = desc)
db.users.find().sort({ country: 1, name: 1 }); // by country, then name (tie-break)
db.users.find().sort({ createdAt: -1 }); // newest first (common)
يأخذ sort وثيقة من الحقل:الاتجاه (1 تصاعدي، -1 تنازلي). تعدد الحقول يوفر كسر التعادل.
db.users.find().sort({ name: 1 }).limit(10); // first 10 (page 1)
db.users.find().sort({ name: 1 }).skip(10).limit(10); // skip 10, take 10 (page 2)
// page N: .skip((N-1) * pageSize).limit(pageSize)
limit(n) يرجع على الأكثر n وثيقة؛ skip(m) يتخطى أول m وثيقة. معاً يطبقان عرض مقسم بالإزاحة (الصفحة N عبر skip + limit).
// ❌ pagination without sort → inconsistent order (pages may overlap/skip)
db.users.find().skip(10).limit(10);
// ✅ sort by a stable field for consistent pages
db.users.find().sort({ _id: 1 }).skip(10).limit(10);
بدون sort، ترتيب الوثائق غير مضمون، لذا قد تكون صفحات العرض المقسم غير متسقة. رتب دائماً بواسطة حقل مستقر (مثل _id) عند تقسيم الصفحات.
// ⚠️ skip(1000000) must scan/skip a million docs → slow on deep pages
// ✅ range-based (cursor) pagination — far more efficient for large datasets
db.users.find({ _id: { $gt: lastSeenId } }).sort({ _id: 1 }).limit(10);
// → use the last document's _id to fetch the next page (uses the index, no skipping)
Sorting on an INDEXED field is efficient. Sorting a large result set WITHOUT an index
requires an in-memory sort (limited size — can fail/be slow for big sorts).
→ Index fields you sort by.
الفرز والعرض المقسم أساسيان لـ عرض البيانات بطريقة مفيدة في MongoDB — ترتيب النتائج وإرجاع صفحات قابلة للإدارة احتياجات شبه عالمية (أي قائمة أو ملف أو جدول في تطبيق)، لذا فإن فهمهما معرفة ضرورية يومية.
معرفة sort (ترتيب الحقول باستخدام 1/-1، مع كسر التعادل) و limit/skip (للـ عرض مقسم بالإزاحة — إرجاع صفحات من البيانات) يغطي الاحتياجات الشائعة لتقديم نتائج الاستعلام.
نقطتان عمليتان مهمتان بشكل خاص: رتب دائماً عند تقسيم الصفحات (بدون ذلك، ترتيب الوثائق غير مضمون، مما يسبب صفحات غير متسقة تتداخل أو تتخطى وثائق — خطأ حقيقي، نفس المشكلة في SQL)، وفهم أن skip بطيئة في الصفحات العميقة (يجب أن تمسح وتتخطى جميع الوثائق السابقة) — لذا العرض المقسم القائم على النطاق (المؤشر) (باستخدام آخر _id شوهد لجلب الصفحة التالية، الاستفادة من الفهرس بدون التخطي) أكثر فعالية بكثير للمجموعات الكبيرة، وهي تقنية أداء قيمة.
معرفة أن الفرز على الحقول المفهرسة فعال بينما الفرز غير المفهرس الكبير قد يكون بطيئاً أو فاشلاً (حدود الفرز في الذاكرة) مهمة أيضاً — فهرس الحقول التي تفرز بها.
نظراً لأن الفرز والعرض المقسم مطلوبان لأي عرض بيانات فعلياً، ولأن متطلبات الاتساق (الفرز للعرض المقسم المستقر) والاعتبارات الأداء (skip مقابل عرض مقسم قائم على النطاق، فرز الحقول المفهرسة) تؤثر مباشرة على الصحة والسرعة، فإن فهم الفرز والعرض المقسم في MongoDB — sort، عرض مقسم بالإزاحة مع skip/limit، متطلبات الفرز المستقر، البديل الفعال القائم على النطاق، وفهرسة حقول الفرز — معرفة ضرورية وتطبق بكثرة لبناء تطبيقات تعرض بيانات MongoDB بفعالية وأداء.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع