📁 الدليل الشامل لأساسيات MongoDB واختبار اختراق NoSQL
1. الهيكلة المعمارية (Architecture & Core Concepts)
تعمل قواعد بيانات NoSQL (مثل MongoDB) بفلسفة مختلفة تماماً عن SQL التقليدية. لا توجد جداول صلبة أو علاقات معقدة، بل مرونة تامة في تخزين البيانات.
-
قاعدة البيانات (Database): الحاوية الكبرى التي تضم كل شيء.
-
المجموعة (Collection): * الوظيفة: تعادل الجدول (Table) في SQL. تستخدم لتجميع البيانات ذات الصلة (مثل
usersأوproducts).-
مرونة الهيكل (Schema-less): لا تشترط أن تكون كل البيانات بداخلها بنفس الهيكل. يمكنك وضع وثيقة تحتوي على 3 حقول بجوار وثيقة تحتوي على 10 حقول مختلفة تماماً في نفس الـ Collection.
-
الإنشاء التلقائي (Auto-Creation): تُنشأ المجموعة برمجياً بمجرد إدخال أول بيانات فيها دون الحاجة لأمر إنشاء صريح مسبق.
-
-
الوثيقة (Document):
-
الوظيفة: تعادل الصف (Row) في SQL.
-
التنسيق: تُخزن البيانات بصيغة BSON (وهي نسخة ثنائية Binary من الـ JSON)، وتتكون من مفتاح وقيمة
{"Key": "Value"}. -
المعرف الفريد (
_id): كل وثيقة يتم إنشاؤها تحصل تلقائياً على حقل إجباري يسمى_idلتمييزها عن باقي الوثائق، ولا يمكن تكراره.
-
2. العمليات الأساسية بالتفصيل (CRUD Operations)
أ. عملية الإنشاء (Create)
إضافة بيانات جديدة إلى الـ Collection.
-
insertOne(document): لإضافة وثيقة واحدة.JavaScript
db.users.insertOne({ "username": "marwan", "role": "admin" }) -
insertMany([document1, document2]): لإضافة عدة وثائق في نفس الوقت باستخدام مصفوفة[].JavaScript
db.users.insertMany([ { "username": "ahmed", "role": "user" }, { "username": "guest", "role": "guest" } ])
ب. عملية القراءة والاستخراج (Read)
البحث عن البيانات وفلترتها.
-
find(query, projection): تُرجع كل الوثائق التي تطابق شرط البحث.-
استخراج كل شيء:
db.users.find()(تعادلSELECT *). -
استخراج بشرط:
db.users.find({ "role": "admin" })
-
-
findOne(query, projection): تُرجع أول وثيقة فقط تطابق الشرط. -
الـ Projection (تحديد الحقول المعروضة): يُكتب كمعامل ثاني للتحكم في شكل المخرجات (إخفاء وإظهار حقول محددة لتقليل حجم البيانات المسترجعة).
-
1للإظهار،0للإخفاء. -
يمنع استخدام
0و1معاً لنفس الاستعلام إلا مع حقل_id. -
مثال سليم:
db.users.find({}, { "username": 1, "_id": 0 })(أظهر اليوزرنيم فقط وأخفِ الـ ID). -
مثال خاطئ:
db.users.find({}, { "username": 1, "role": 0 })(سيُصدر خطأ برمجي).
-
ج. عملية التحديث (Update)
تعديل بيانات موجودة بالفعل، وتتطلب المعاملات الخاصة بالتعديل ($set, $inc وغيرها).
-
updateOne(query, update, options): تُعدل أول وثيقة تطابق الفلتر.JavaScript
// تعديل صلاحية المستخدم marwan db.users.updateOne({ "username": "marwan" }, { $set: { "role": "superadmin" } }) -
updateMany(query, update, options): تُعدل كل الوثائق التي تطابق الفلتر. -
خاصية الـ Upsert: تُمرر كخيار ثالث
{ upsert: true }. إذا تطابق الفلتر مع بيانات موجودة سيتم التحديث، وإذا لم يتطابق سيتم أخذ البيانات الممررة وإنشاء وثيقة جديدة تماماً بها.JavaScript
db.users.updateOne({ "username": "new_user" }, { $set: { "age": 25 } }, { upsert: true })
د. عملية الحذف (Delete)
إزالة وثائق من المجموعة.
-
deleteOne(query): تحذف أول وثيقة تطابق الشرط. -
deleteMany(query): تحذف كل الوثائق التي تطابق الشرط.- ⚠️ خطر أمني: إرسال استعلام حذف فارغ
db.users.deleteMany({})يمسح جميع بيانات المجموعة ويسبب فقدان تام للبيانات (Data Loss).
- ⚠️ خطر أمني: إرسال استعلام حذف فارغ
3. المعاملات الشرطية (Operators) - الترسانة الأهم!
لفلترة البيانات وبناء استعلامات معقدة، نستخدم الـ Operators التي تبدأ دائماً بـ $.
1. معاملات المقارنة (Comparison):
-
$eq(Equal): يساوي.{"age": {"$eq": 20}} -
$ne(Not Equal): لا يساوي.{"username": {"$ne": "admin"}} -
$gt(Greater Than): أكبر من. -
$lt(Less Than): أصغر من. -
$in(In Array): يبحث إذا كانت القيمة موجودة داخل مصفوفة خيارات.
2. معاملات التعديل (Update Operators):
-
$set: استبدال قيمة أو إنشاء حقل جديد وتعيين قيمته. -
$inc: زيادة أو نقصان قيمة رقمية بمقدار محدد (مثال:{"$inc": {"failed_logins": 1}}). -
$unset: حذف حقل معين بالكامل من الوثيقة.
3. معاملات خطيرة (Evaluation Operators):
-
$regex: للبحث بالنصوص باستخدام التعبيرات النمطية (Regular Expressions). -
$where: يسمح بتنفيذ دوال JavaScript بالكامل داخل محرك البحث الخاص بقاعدة البيانات.