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 -> limit3. 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 التطبيق العملي المباشر
تحدي الدرس الثاني: الترتيب والصفحات
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- رتّب المستخدمين حسب العمر تصاعدياً.
- اعرض أعلى 3 أعمار (ترتيب تنازلي + limit).
- أنشئ الصفحة الثانية (skip=2، limit=2).
- رتّب حسب حقلين: الدولة ثم العمر.
- دمج الفلتر مع الترتيب: مستخدمو السعودية ومصر الأكبر سناً.
⏳ جارٍ تحميل المحرر التفاعلي...