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

المعاملات المنطقية والبحث المتقدم ($and, $or, $in, $not)

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

أهداف الدرس

  • دمج شروط متعددة بـ $and و $or.
  • الفحص بالقوائم عبر $in و $nin.
  • عكس الشروط بـ $not للاستثناء الدقيق.
  • التحقق من وجود الحقول بـ $exists والبحث بالأنماط عبر $regex.

1. $and و $or — قلب الاستعلامات المنطقية

$and — جميع الشروط
  • يُرجع مستنداً إذا تحققت كل الشروط
  • يعادل كتابة الشروط متجاورة
  • مثال: فوق 25 و من مصر
$or — أحد الشروط
  • يُرجع مستنداً إذا تحقق شرط واحد على الأقل
  • لا يمكن تعويضه بكتابة متجاورة
  • مثال: من السعودية أو الإمارات
javascript
// $and — فوق 25 ومن مصر
db.users.find({
  $and: [
    { age: { $gt: 25 } },
    { country: "مصر" }
  ]
});

// نفس النتيجة (كتابة ضمنية):
db.users.find({
  age: { $gt: 25 },
  country: "مصر"
});

// $or — من السعودية أو الإمارات
db.users.find({
  $or: [
    { country: "السعودية" },
    { country: "الإمارات" }
  ]
});

2. $in و $nin — الفحص بالقوائم

عندما تريد البحث عن قائمة قيم في حقل واحد، استخدم $in. هذا أنظف من كتابة $or مع 5 شروط على نفس الحقل.

$in — ضمن القائمة
db.users.find({
  age: { $in: [25, 28, 34] }
})
$nin — خارج القائمة
db.users.find({
  country: { $nin: ["مصر", "السعودية"] }
})
javascript
// بدون $in — طويل ومكرر
db.users.find({
  $or: [
    { age: 25 },
    { age: 28 },
    { age: 34 }
  ]
});

// مع $in — أنظف وأسرع
db.users.find({
  age: { $in: [25, 28, 34] }
});

3. $exists و $regex و $not

$exists
{ email:
  { $exists: true } }
$regex
{ name:
  { $regex: "^ج" } }
$not
{ country:
  { $not: { $eq: "مصر" } } }
javascript
// $exists: true — الحقل موجود (حتى لو كان null)
db.users.find({ email: { $exists: true } });

// $exists: false — الحقل غير موجود
db.users.find({ phone: { $exists: false } });

// $regex — بداية النص
db.users.find({ name: { $regex: "^ج" } });

// $regex — نهاية النص
db.users.find({ email: { $regex: "@example.com$" } });

// $regex — يحتوي
db.users.find({ name: { $regex: "محمد" } });

// مع $options: i = case-insensitive
db.users.find({ name: { $regex: "^ج", $options: "i" } });

// $not — استثناء قيمة
db.users.find({ country: { $not: { $eq: "مصر" } } });

// $not مع $regex — استثناء نمط
db.users.find({ name: { $not: { $regex: "^ج" } } });

4. دمج المعاملات

javascript
// السيناريو: 
// "أريد مستخدمين من مصر أو السعودية، أعمارهم فوق 25، 
//  وأسماؤهم تبدأ بحرف (م)"

db.users.find({
  $and: [
    {
      $or: [
        { country: "مصر" },
        { country: "السعودية" }
      ]
    },
    { age: { $gt: 25 } },
    { name: { $regex: "^م" } }
  ]
});

// هذا هو "التفكير المركّب" في MongoDB —
// تدمج عدة معاملات لتصل إلى نتيجة دقيقة.
التطبيق العملي المباشر

تحدي الدرس الأول: المعاملات المنطقية

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

  1. استخدم $or للبحث عن المستخدمين من السعودية أو الإمارات.
  2. استخدم $and للبحث عن المستخدمين فوق 25 سنة ومن مصر.
  3. استخدم $in للبحث عن أعمار محددة [25, 28, 34].
  4. استخدم $not لاستثناء مستخدمي مصر.
  5. استخدم $exists و $regex للبحث المتقدم.
⏳ جارٍ تحميل المحرر التفاعلي...