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" } }
); التطبيق العملي المباشر
تحدي الدرس الثالث: إدارة المصفوفات
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- أضف مهارة
"Next.js"لمستخدم معيّن بـ$addToSet. - أضف مهارة
"Python"لمستخدم آخر بـ$push. - احذف مهارة
"Node.js"من مستخدم بـ$pull. - أضف مهارة
"Git"لجميع المستخدمين بـupdateMany. - اعرض النتائج للتحقق من عدم وجود تكرار.
⏳ جارٍ تحميل المحرر التفاعلي...