السبت - الخميس: 10:00 ص - 10:00 م

مقدمة إلى قواعد بيانات NoSQL و MongoDB

ابدأ مع قواعد بيانات NoSQL وتعلم كيفية استخدام MongoDB في تطبيقاتك.

مقدمة إلى قواعد بيانات NoSQL و MongoDB

مقدمة إلى قواعد بيانات NoSQL و MongoDB

قواعد بيانات NoSQL (Not Only SQL) هي نوع جديد من قواعد البيانات التي تختلف عن قواعد البيانات العلائقية التقليدية. MongoDB هي أشهر وأقوى قاعدة بيانات NoSQL، وتستخدم على نطاق واسع في التطبيقات الحديثة.

ما هي قواعد بيانات NoSQL؟

NoSQL هي قواعد بيانات لا تستخدم الجداول العلائقية التقليدية. بدلاً من ذلك، تستخدم نماذج بيانات مختلفة مثل المستندات، المفاتيح-القيم، الرسوم البيانية، أو الأعمدة العريضة.

أنواع قواعد بيانات NoSQL:

📄 Document Databases (قواعد بيانات المستندات)

تخزن البيانات في مستندات (عادة JSON أو BSON)

  • MongoDB
  • CouchDB
  • Amazon DocumentDB

🔑 Key-Value Stores (مخازن المفاتيح-القيم)

تخزن البيانات كأزواج من المفاتيح والقيم

  • Redis
  • DynamoDB
  • Riak

📊 Column-Family (عائلات الأعمدة)

تخزن البيانات في أعمدة بدلاً من الصفوف

  • Cassandra
  • HBase
  • Amazon SimpleDB

🕸️ Graph Databases (قواعد بيانات الرسوم البيانية)

تخزن البيانات كعقد وعلاقات

  • Neo4j
  • Amazon Neptune
  • ArangoDB

مقارنة بين SQL و NoSQL:

🗃️ SQL (قواعد البيانات العلائقية)

  • ✅ هيكل ثابت ومحدد
  • ✅ ACID Properties
  • ✅ استعلامات معقدة
  • ✅ نضج تقني
  • ❌ صعوبة التوسع الأفقي
  • ❌ هيكل صارم

📄 NoSQL (قواعد البيانات غير العلائقية)

  • ✅ مرونة في الهيكل
  • ✅ سهولة التوسع الأفقي
  • ✅ أداء عالي
  • ✅ سهولة التطوير
  • ❌ عدم وجود معايير موحدة
  • ❌ استعلامات محدودة

مقدمة إلى MongoDB:

MongoDB هي قاعدة بيانات مستندات مفتوحة المصدر، تخزن البيانات في مستندات BSON (Binary JSON) مرنة وقابلة للتوسع.

مزايا MongoDB:

🔄 مرونة في الهيكل

لا تحتاج لتحديد الهيكل مسبقاً

📈 قابلية التوسع

سهولة التوسع الأفقي والعمودي

⚡ أداء عالي

سرعة في القراءة والكتابة

🌐 دعم JSON

متوافق مع JavaScript و APIs

مفاهيم أساسية في MongoDB:

🗄️ Database (قاعدة البيانات)

حاوية للمجموعات

use myapp

📁 Collection (المجموعة)

مثل الجدول في SQL

db.users

📄 Document (المستند)

مثل الصف في SQL

{
  "_id": ObjectId("..."),
  "name": "أحمد محمد",
  "email": "[email protected]",
  "age": 25
}

🔑 Field (الحقل)

مثل العمود في SQL

name, email, age

العمليات الأساسية في MongoDB:

إنشاء مستند (Create):

// إدراج مستند واحد
db.users.insertOne({
  name: "أحمد محمد",
  email: "[email protected]",
  age: 25,
  city: "القاهرة"
});

// إدراج عدة مستندات
db.users.insertMany([
  {
    name: "سارة أحمد",
    email: "[email protected]",
    age: 23,
    city: "الإسكندرية"
  },
  {
    name: "محمد علي",
    email: "[email protected]",
    age: 30,
    city: "الجيزة"
  }
]);

قراءة المستندات (Read):

// جلب جميع المستخدمين
db.users.find();

// جلب مستخدم محدد
db.users.findOne({ name: "أحمد محمد" });

// جلب المستخدمين من القاهرة
db.users.find({ city: "القاهرة" });

// جلب المستخدمين أكبر من 25 سنة
db.users.find({ age: { $gt: 25 } });

// جلب المستخدمين مع تحديد الحقول
db.users.find({}, { name: 1, email: 1 });

تحديث المستندات (Update):

// تحديث مستند واحد
db.users.updateOne(
  { name: "أحمد محمد" },
  { $set: { age: 26 } }
);

// تحديث عدة مستندات
db.users.updateMany(
  { city: "القاهرة" },
  { $set: { country: "مصر" } }
);

// إضافة حقل جديد
db.users.updateOne(
  { name: "أحمد محمد" },
  { $set: { phone: "01234567890" } }
);

حذف المستندات (Delete):

// حذف مستند واحد
db.users.deleteOne({ name: "أحمد محمد" });

// حذف عدة مستندات
db.users.deleteMany({ city: "القاهرة" });

// حذف جميع المستندات
db.users.deleteMany({});

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

مشغلات المقارنة:

// أكبر من
db.users.find({ age: { $gt: 25 } });

// أكبر من أو يساوي
db.users.find({ age: { $gte: 25 } });

// أقل من
db.users.find({ age: { $lt: 30 } });

// أقل من أو يساوي
db.users.find({ age: { $lte: 30 } });

// لا يساوي
db.users.find({ city: { $ne: "القاهرة" } });

// في قائمة
db.users.find({ city: { $in: ["القاهرة", "الإسكندرية"] } });

// ليس في قائمة
db.users.find({ city: { $nin: ["القاهرة", "الإسكندرية"] } });

مشغلات منطقية:

// AND
db.users.find({
  $and: [
    { age: { $gt: 25 } },
    { city: "القاهرة" }
  ]
});

// OR
db.users.find({
  $or: [
    { city: "القاهرة" },
    { city: "الإسكندرية" }
  ]
});

// NOT
db.users.find({
  $not: { age: { $lt: 25 } }
});

الترتيب والحد:

// ترتيب تصاعدي
db.users.find().sort({ age: 1 });

// ترتيب تنازلي
db.users.find().sort({ age: -1 });

// تحديد عدد النتائج
db.users.find().limit(5);

// تخطي النتائج
db.users.find().skip(10).limit(5);

الفهرسة في MongoDB:

أنواع الفهارس:

// فهرس بسيط
db.users.createIndex({ email: 1 });

// فهرس مركب
db.users.createIndex({ name: 1, age: -1 });

// فهرس نصي
db.users.createIndex({ name: "text", email: "text" });

// فهرس فريد
db.users.createIndex({ email: 1 }, { unique: true });

// فهرس جزئي
db.users.createIndex(
  { age: 1 },
  { partialFilterExpression: { age: { $gte: 18 } } }
);

إدارة الفهارس:

// عرض جميع الفهارس
db.users.getIndexes();

// حذف فهرس
db.users.dropIndex({ email: 1 });

// حذف جميع الفهارس
db.users.dropIndexes();

التجميع (Aggregation) في MongoDB:

مثال على التجميع:

// تجميع المستخدمين حسب المدينة
db.users.aggregate([
  {
    $group: {
      _id: "$city",
      count: { $sum: 1 },
      avgAge: { $avg: "$age" }
    }
  },
  {
    $sort: { count: -1 }
  }
]);

// تجميع مع شروط
db.users.aggregate([
  {
    $match: { age: { $gte: 18 } }
  },
  {
    $group: {
      _id: "$city",
      totalUsers: { $sum: 1 },
      averageAge: { $avg: "$age" }
    }
  },
  {
    $project: {
      city: "$_id",
      totalUsers: 1,
      averageAge: { $round: ["$averageAge", 2] }
    }
  }
]);

استخدام MongoDB مع Node.js:

إعداد المشروع:

npm install mongodb mongoose

الاتصال بقاعدة البيانات:

const { MongoClient } = require('mongodb');

const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri);

async function connectDB() {
  try {
    await client.connect();
    console.log('تم الاتصال بقاعدة البيانات');
    return client.db('myapp');
  } catch (error) {
    console.error('خطأ في الاتصال:', error);
  }
}

استخدام Mongoose (ODM):

const mongoose = require('mongoose');

// الاتصال
mongoose.connect('mongodb://localhost:27017/myapp');

// تعريف النموذج
const userSchema = new mongoose.Schema({
  name: String,
  email: { type: String, unique: true },
  age: Number,
  city: String
});

const User = mongoose.model('User', userSchema);

// إنشاء مستخدم
const user = new User({
  name: 'أحمد محمد',
  email: '[email protected]',
  age: 25,
  city: 'القاهرة'
});

await user.save();

// البحث
const users = await User.find({ city: 'القاهرة' });

أفضل الممارسات في MongoDB:

  • استخدم الفهارس للاستعلامات المتكررة
  • تجنب الاستعلامات التي تحتاج لفحص جميع المستندات
  • استخدم التجميع للعمليات المعقدة
  • خطط لهيكل البيانات مسبقاً
  • استخدم النسخ الاحتياطية بانتظام
  • راقب الأداء باستخدام MongoDB Compass

متى تستخدم MongoDB؟

✅ مناسب لـ:

  • تطبيقات الويب الحديثة
  • تطبيقات الجوال
  • أنظمة إدارة المحتوى
  • تطبيقات IoT
  • البيانات غير المهيكلة

❌ غير مناسب لـ:

  • الأنظمة المالية المعقدة
  • قواعد البيانات العلائقية المعقدة
  • الأنظمة التي تحتاج ACID كامل
  • الاستعلامات المعقدة جداً

أدوات مفيدة لـ MongoDB:

  • MongoDB Compass - واجهة رسومية
  • MongoDB Atlas - خدمة سحابية
  • Mongoose - ODM لـ Node.js
  • Robo 3T - عميل MongoDB
  • MongoDB Charts - تصور البيانات

MongoDB هي أداة قوية للبيانات الحديثة. ابدأ في تعلمها اليوم!

تعلم MongoDB معنا

تواصل معنا

عبر الماسنجر او الهاتف