NahdaAIنهضة
NoSQL Databases • المستوى الثاني • الدرس 2

الترتيب والتصفح والصفحات (sort, limit, skip)

العودة لفهرس المستوى

أهداف الدرس

  • ترتيب النتائج بـ sort() (تصاعدي / تنازلي).
  • الترتيب حسب حقول متعددة (Country ثم Age).
  • تحديد عدد النتائج بـ limit() وتخطّيها بـ skip().
  • بناء نظام Pagination كامل (صفحات متعددة).

1. الترتيب — sort()

sort() يحدد ترتيب النتائج. القيمة 1 = تصاعدي، -1 = تنازلي.

javascript
// ترتيب تصاعدي حسب العمر (الأصغر أولاً)
db.users.find({}).sort({ age: 1 });

// ترتيب تنازلي حسب العمر (الأكبر أولاً)
db.users.find({}).sort({ age: -1 });

// ترتيب حسب حقل نصي (أبجدي)
db.users.find({}).sort({ name: 1 });

// ترتيب حسب حقول متعددة:
// أولاً حسب country (تصاعدي)، ثم age (تنازلي)
db.users.find({}).sort({ country: 1, age: -1 });
تصاعدي = 1

10، 20، 30، 40، 50

تنازلي = -1

50، 40، 30، 20، 10

2. الحد والتخطّي — limit() و skip()

limit(n) — أول n مستند
db.users.find({})
  .limit(3)
skip(n) — تجاهل أول n
db.users.find({})
  .skip(2)
  .limit(3)
javascript
// أول 5 مستخدمين
db.users.find({}).limit(5);

// تجاهل أول 10 مستخدمين
db.users.find({}).skip(10);

// المستخدمون 11-15 (نتائج 10 إلى 14)
db.users.find({}).skip(10).limit(5);

// الترتيب مهم: sort -> skip -> limit

3. Pagination — بناء صفحات متعددة

في التطبيقات الحقيقية، نعرض البيانات في صفحات. المعادلة الذهبية:

المعادلة
skip = (pageNumber - 1) × pageSize
limit = pageSize
javascript
// مثال: 6 مستخدمين، عرض 2 لكل صفحة

// الصفحة 1 — skip = (1-1)*2 = 0
db.users.find({})
  .sort({ age: 1 })
  .skip(0)
  .limit(2);

// الصفحة 2 — skip = (2-1)*2 = 2
db.users.find({})
  .sort({ age: 1 })
  .skip(2)
  .limit(2);

// الصفحة 3 — skip = (3-1)*2 = 4
db.users.find({})
  .sort({ age: 1 })
  .skip(4)
  .limit(2);

// في تطبيقك:
// const page = 2;
// const pageSize = 20;
// const skip = (page - 1) * pageSize;
// db.posts.find({}).skip(skip).limit(pageSize);

4. ترتيب سلاسل العمليات (Order Matters!)

في MongoDB، ترتيب العمليات في السلسلة مهم.

javascript
// الترتيب الصحيح: sort -> skip -> limit
db.users.find({})
  .sort({ age: -1 })   // 1. رتّب جميع المستخدمين
  .skip(2)             // 2. تجاهل أول 2
  .limit(3);           // 3. خذ التالي 3

// النتيجة: المرتبة 3، 4، 5 من الأعلى عمراً

// ترتيب خاطئ (نظرياً صحيح لكن مربك):
db.users.find({})
  .limit(3)            // 1. خذ أول 3 (بدون ترتيب!)
  .sort({ age: -1 });  // 2. رتّب فقط هذه الـ 3
التطبيق العملي المباشر

تحدي الدرس الثاني: الترتيب والصفحات

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. رتّب المستخدمين حسب العمر تصاعدياً.
  2. اعرض أعلى 3 أعمار (ترتيب تنازلي + limit).
  3. أنشئ الصفحة الثانية (skip=2، limit=2).
  4. رتّب حسب حقلين: الدولة ثم العمر.
  5. دمج الفلتر مع الترتيب: مستخدمو السعودية ومصر الأكبر سناً.
⏳ جارٍ تحميل المحرر التفاعلي...