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: "السعودية" }); التطبيق العملي المباشر
تحدي الدرس الثالث: الاستعلامات المتقدمة
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- أضف حقل
age: 1إلى Projection في الاستعلام الثالث. - استخدم
$gtلجلب المستخدمين فوق 26 سنة. - استخدم
$ltلجلب المستخدمين أصغر من 28 سنة. - اطبع النتائج باستخدام
print()لكل قسم. - اطبع العدد الإجمالي بـ
countDocuments().
⏳ جارٍ تحميل المحرر التفاعلي...