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

استعلامات التعديل وإدارة المصفوفات ($addToSet, $pull, $push)

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

أهداف الدرس

  • إضافة عناصر فريدة لمصفوفة بـ $addToSet بدون تكرار.
  • إضافة عنصر مع السماح بالتكرار بـ $push.
  • حذف عناصر محددة من المصفوفة بـ $pull.
  • تطبيق التعديلات على مستند واحد أو جميع المستندات (updateMany).

1. $addToSet — إضافة عنصر فريد

$addToSet يضيف عنصراً إلى المصفوفة فقط إذا لم يكن موجوداً. مثالي للمهارات والوسوم (Tags) التي لا يجب أن تتكرر.

javascript
// إضافة مهارة جديدة (نجحت)
db.users.updateOne(
  { name: "جمال" },
  { $addToSet: { skills: "Next.js" } }
);
// النتيجة: skills = ["React", "Node.js", "MongoDB", "Next.js"]

// إضافة نفس المهارة (لن تُضاف)
db.users.updateOne(
  { name: "جمال" },
  { $addToSet: { skills: "Next.js" } }
);
// النتيجة: skills تبقى كما هي — لا تكرار!

2. $push — إضافة عنصر مع السماح بالتكرار

$push يضيف العنصر دائماً حتى لو كان موجوداً. مناسب للسجلات (Logs)، الإشعارات، والرسائل.

javascript
// إضافة مهارة (تُضاف دائماً)
db.users.updateOne(
  { name: "سارة" },
  { $push: { skills: "Python" } }
);

// إضافة نفس المهارة مرة أخرى
db.users.updateOne(
  { name: "سارة" },
  { $push: { skills: "Python" } }
);
// النتيجة: skills = ["Python", "Python"] — تكرار!

// الفرق الجوهري:
// $addToSet -> فريد (Set semantics)
// $push     -> دائم (List semantics)

3. $pull — حذف عنصر من المصفوفة

$pull يحذف جميع العناصر التي تُطابق القيمة المحددة.

javascript
// حذف مهارة معيّنة
db.users.updateOne(
  { name: "جمال" },
  { $pull: { skills: "Node.js" } }
);
// النتيجة: Node.js تُحذف من المصفوفة

// حذف جميع العناصر المطابقة
db.users.updateMany(
  {},
  { $pull: { skills: "React" } }
);
// النتيجة: React تُحذف من جميع المستخدمين

// $pull يعمل بـ "مطابقة دقيقة" (Exact Match)
// لحذف عناصر أكثر تعقيداً، يمكن استخدام شروط:
db.users.updateMany(
  {},
  { $pull: { skills: { $in: ["HTML", "CSS"] } } }
);

4. مقارنة شاملة

$addToSet
  • يضيف عنصراً فريداً فقط
  • يمنع التكرار
  • مثالي: Skills, Tags
$push
  • يضيف العنصر دائماً
  • يسمح بالتكرار
  • مثالي: Logs, Messages
$pull
  • يحذف عناصر مطابقة
  • يحذف جميع التطابقات
  • مثالي: Cleanup
javascript
// سيناريو واقعي: إدارة مهارات مستخدم
// 1. إضافة مهارة فريدة
db.users.updateOne(
  { name: "جمال" },
  { $addToSet: { skills: "TypeScript" } }
);

// 2. إضافة نشاط للسجل (يُسمح بالتكرار)
db.users.updateOne(
  { name: "جمال" },
  { $push: { activities: "تسجيل دخول" } }
);

// 3. حذف مهارة قديمة
db.users.updateOne(
  { name: "جمال" },
  { $pull: { skills: "jQuery" } }
);
التطبيق العملي المباشر

تحدي الدرس الثالث: إدارة المصفوفات

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

  1. أضف مهارة "Next.js" لمستخدم معيّن بـ $addToSet.
  2. أضف مهارة "Python" لمستخدم آخر بـ $push.
  3. احذف مهارة "Node.js" من مستخدم بـ $pull.
  4. أضف مهارة "Git" لجميع المستخدمين بـ updateMany.
  5. اعرض النتائج للتحقق من عدم وجود تكرار.
⏳ جارٍ تحميل المحرر التفاعلي...