NahdaAIنهضة
NoSQL Databases • المستوى الأول • الدرس 3

قراءة وفلترة المستندات (find & findOne & Projection)

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

أهداف الدرس

  • استخراج المستندات بـ find و findOne.
  • استعمال تقنية Projection لتحديد وتصفية الحقول المطلوبة تقليلاً للحجم.
  • استخدام معاملات المقارنة $gt، $lt، $gte، $lte.
  • فهم الفرق بين find() (متعدد) و findOne() (واحد).

1. الفرق بين find() و findOne()

db.collection.find()
  • يُرجع جميع المستندات المطابقة
  • الناتج: Cursor (مؤشر للنتائج)
  • يقبل filter + projection
  • إذا لم يُطابق أي مستند → يُرجع []
db.collection.findOne()
  • يُرجع أول مستند مطابق فقط
  • الناتج: Document مباشرة
  • يقبل filter + projection
  • إذا لم يُطابق → يُرجع null

2. تقنية Projection — تحديد الحقول المرتجعة

Projection هي الوسيط الثاني لـ find(). تحدد أي الحقول تُرجَع من المستند. الفائدة: تقليل حجم البيانات المُرسلة عبر الشبكة.

javascript
// القاعدة:
// 1 = أظهر الحقل
// 0 = أخفِ الحقل

// مثال 1: الاسم والإيميل فقط
db.users.find({}, { name: 1, email: 1, _id: 0 });
// الناتج: { name: "...", email: "..." } لكل مستند

// مثال 2: كل الحقول ما عدا country
db.users.find({}, { country: 0 });

// لا يمكن خلط 1 و 0 (إلا مع _id)
db.users.find({}, { name: 1, age: 0 }); // خطأ
db.users.find({}, { name: 1, _id: 0 }); // مسموح

3. معاملات المقارنة (Comparison Operators)

$gt — أكبر من
db.users.find({
  age: { $gt: 26 }
})
$lt — أصغر من
db.users.find({
  age: { $lt: 30 }
})
$gte — أكبر أو يساوي
db.users.find({
  age: { $gte: 30 }
})
$lte — أصغر أو يساوي
db.users.find({
  age: { $lte: 25 }
})

4. أمثلة عملية شاملة

javascript
// 1. كل المستخدمين
db.users.find();

// 2. مستخدم واحد بعمر 30
db.users.findOne({ age: 30 });

// 3. المستخدمون من مصر
db.users.find({ country: "مصر" });

// 4. الاسم فقط للمستخدمين فوق 25
db.users.find(
  { age: { $gt: 25 } },
  { name: 1, _id: 0 }
);

// 5. عدد المستخدمين في السعودية
db.users.countDocuments({ country: "السعودية" });
التطبيق العملي المباشر

تحدي الدرس الثالث: الاستعلامات المتقدمة

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

  1. أضف حقل age: 1 إلى Projection في الاستعلام الثالث.
  2. استخدم $gt لجلب المستخدمين فوق 26 سنة.
  3. استخدم $lt لجلب المستخدمين أصغر من 28 سنة.
  4. اطبع النتائج باستخدام print() لكل قسم.
  5. اطبع العدد الإجمالي بـ countDocuments().
⏳ جارٍ تحميل المحرر التفاعلي...