تخطَّ إلى المحتوى

مقدمة في MongoDB: قاعدة بيانات المستندات

الدرس 1 من 8 · MongoDB

تعرفت في كورس SQL على قواعد البيانات التي تحفظ البيانات في جداول صارمة: أعمدة محددة مسبقاً، وكل صف يجب أن يلتزم بها. لكن ماذا لو كانت بياناتك متنوعة ومتغيرة؟ في هذا الدرس ستتعرف على MongoDB، قاعدة بيانات من نوع مختلف تخزن البيانات في مستندات مرنة.

NoSQL اسم لعائلة من قواعد البيانات التي لا تعتمد على الجداول كطريقة أساسية للتخزين. والاسم يُفسَّر غالباً بأنه «Not Only SQL» أي «ليس SQL فقط».

ظهرت هذه القواعد لتناسب تطبيقات الإنترنت الحديثة: بيانات ضخمة، وتتغير بسرعة، وأشكالها غير ثابتة. و MongoDB أشهر قاعدة بيانات من هذا النوع، وظهرت عام 2009.

في MongoDB تُحفظ البيانات في مستندات (Documents)، وكل مستند يشبه كائن JSON: أزواج من المفاتيح والقيم بين أقواس معقوفة:

{
"name": "منى",
"age": 14,
"city": "طنطا",
"hobbies": ["القراءة", "الرسم"]
}

لاحظ شيئين مهمين:

  • القيمة يمكن أن تكون قائمة مثل الهوايات، أو حتى مستنداً آخر بداخله. هذا صعب في الجداول التقليدية.
  • لو تعلمت JavaScript أو Python، ستجد الشكل مألوفاً جداً: إنه مثل الكائن في JavaScript أو القاموس في Python.

المجموعات وقواعد البيانات

Section titled “المجموعات وقواعد البيانات”
في قواعد SQL في MongoDB
قاعدة بيانات (Database) قاعدة بيانات (Database)
جدول (Table) مجموعة (Collection)
صف (Row) مستند (Document)
عمود (Column) حقل (Field)

المجموعة (Collection) تضم مستندات من نفس النوع تقريباً، مثل مجموعة students. لكن على عكس الجدول، ليس شرطاً أن يكون لكل المستندات نفس الحقول:

{ "name": "علي", "age": 15 }
{ "name": "سارة", "age": 13, "phone": "0100000000" }

المستند الثاني فيه حقل phone غير موجود في الأول، وهذا مسموح تماماً.

تخيّل الجدول مثل استمارة رسمية مطبوعة: الخانات ثابتة للجميع. أما المستند فمثل ملف شخصي في مجلد: لكل شخص ملفه بالمعلومات التي تخصه، وقد يكون ملف أحدهم أطول من غيره.

  • البيانات متنوعة الشكل: مثل منتجات متجر، حيث للهاتف خصائص تختلف عن خصائص الكتاب.
  • التطوير السريع: تستطيع إضافة حقول جديدة دون تعديل «هيكل» قاعدة البيانات.
  • التطبيقات المبنية بـ JavaScript: شكل البيانات قريب من كائنات JavaScript، فيسهل التعامل معها.

ومتى تكون قواعد SQL أفضل؟ عندما تكون البيانات منظمة جداً، وبينها علاقات كثيرة ودقيقة، مثل الأنظمة المحاسبية والبنكية. لا توجد قاعدة أفضل مطلقاً، بل لكل نوع استخداماته.

يمكنك التعامل مع MongoDB عبر أداة سطر الأوامر mongosh. هذا مثال لإضافة مستند والبحث عنه:

use school
db.students.insertOne({ name: "منى", age: 14, city: "طنطا" })
  • use school: اختر قاعدة البيانات school، وستُنشأ تلقائياً عند أول إضافة.
  • db.students: المجموعة students، وهي أيضاً تُنشأ تلقائياً.
  • insertOne: أضف مستنداً واحداً.

ستظهر رسالة تأكيد فيها معرّف المستند الجديد، شكلها تقريباً هكذا (المعرّف عندك سيختلف):

الناتج
{ acknowledged: true, insertedId: ObjectId('...') }

كل مستند يحصل تلقائياً على حقل خاص اسمه _id بقيمة فريدة، مثل رقم قومي لا يتكرر.

وللبحث:

db.students.find({ city: "طنطا" })

هذا يعيد كل الطلاب الذين يسكنون في طنطا. لاحظ أن الشرط نفسه مكتوب كمستند! هذه فكرة متكررة في MongoDB.

صمّم على الورق مستندات لـ ثلاثة منتجات في متجر إلكتروني بأشكال مختلفة:

  1. هاتف: الاسم، والسعر، والذاكرة، والألوان المتاحة (قائمة).
  2. كتاب: الاسم، والسعر، والمؤلف، وعدد الصفحات.
  3. قميص: الاسم، والسعر، والمقاسات المتاحة (قائمة).

لاحظ كيف تشترك المستندات الثلاثة في الاسم والسعر، بينما لكل منها حقول خاصة به. فكّر: كيف كنت ستصمم جدولاً واحداً في SQL يتسع لكل هذه المنتجات؟

  • الظن أن المرونة تعني الفوضى: حتى مع حرية الحقول، حافظ على أسماء حقول ثابتة ومنظمة. name في مستند و Name في آخر سيسبب لك مشكلات في البحث.
  • نسيان أن MongoDB حساسة لحالة الأحرف: city و City حقلان مختلفان.
  • اختيار MongoDB لكل شيء: البيانات ذات العلاقات الكثيرة والدقيقة قد تناسبها قواعد SQL أكثر.

سؤال

ما الذي يقابل «الجدول» في MongoDB؟

سؤال

أي عبارة صحيحة عن المستندات في نفس المجموعة؟

  • MongoDB قاعدة بيانات NoSQL تخزن البيانات في مستندات تشبه JSON.
  • المستند أزواج مفاتيح وقيم، ويمكن أن يحتوي قوائم ومستندات متداخلة.
  • المجموعة تقابل الجدول، والمستند يقابل الصف، والحقل يقابل العمود.
  • المستندات في نفس المجموعة يمكن أن تختلف حقولها، ولكل مستند _id فريد.
  • insertOne للإضافة و find للبحث، واختر MongoDB عندما تناسب بياناتك المرونة.