MongoDB هي قاعدة بيانات وثائقية مفتوحة المصدر تم تصميمها لتوفير قابلية توسع عالية وأداء متميز وتوافر مستمر. على عكس قواعد البيانات العلائقية التقليدية، تستخدم MongoDB نموذج بيانات مرن يعتمد على الوثائق بتنسيق BSON (Binary JSON)، مما يسمح بتخزين البيانات بطريقة أكثر طبيعية وفعالية للتطبيقات الحديثة.
MongoDB هي قاعدة بيانات NoSQL، وهذا يعني أنها لا تستخدم لغة SQL التقليدية للاستعلامات. بدلاً من ذلك، تستخدم MongoDB واجهة برمجة تطبيقات خاصة بها تعتمد على الكائنات والدوال.
يمكن تثبيت MongoDB على مختلف أنظمة التشغيل بما في ذلك Windows وmacOS وLinux. سنستعرض خطوات التثبيت لكل نظام تشغيل.
تنزيل المثبت: قم بزيارة الموقع الرسمي لـ MongoDB وتنزيل أحدث إصدار من MongoDB Community Server.
تشغيل المثبت: قم بتشغيل ملف التثبيت الذي تم تنزيله واتبع التعليمات.
اختر "Complete" للتثبيت الكامل أو "Custom" لتخصيص خيارات التثبيت.
تكوين MongoDB كخدمة: خلال عملية التثبيت، يمكنك اختيار تثبيت MongoDB كخدمة Windows، وهو ما يوصى به.
التحقق من التثبيت: افتح موجه الأوامر وقم بتشغيل الأمر التالي للتحقق من إصدار MongoDB المثبت:
mongod --version
يمكن تثبيت MongoDB على macOS باستخدام Homebrew أو من خلال تنزيل الحزمة مباشرة.
brew tap mongodb/brew
brew install mongodb-community
brew services start mongodb-community
# إضافة مفتاح GPG الرسمي لـ MongoDB
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
# إضافة مستودع MongoDB
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
# تحديث قائمة الحزم
sudo apt-get update
# تثبيت MongoDB
sudo apt-get install -y mongodb-org
# بدء خدمة MongoDB
sudo systemctl start mongod
# تمكين MongoDB للبدء تلقائيًا عند إعادة تشغيل النظام
sudo systemctl enable mongod
بعد تثبيت MongoDB، يمكنك تثبيت MongoDB Compass، وهي واجهة مستخدم رسومية لإدارة قواعد بيانات MongoDB بشكل مرئي. يمكن تنزيلها من هنا.
قبل البدء في استخدام MongoDB، من المهم فهم المفاهيم الأساسية التي تشكل بنية قاعدة البيانات.
قواعد البيانات العلائقية | MongoDB |
---|---|
قاعدة البيانات | قاعدة البيانات |
الجداول | المجموعات (Collections) |
الصفوف | الوثائق (Documents) |
الأعمدة | الحقول (Fields) |
المفتاح الأساسي | _id |
الفهارس | الفهارس |
الجداول المرتبطة / الانضمام | الوثائق المضمنة / المراجع |
قاعدة البيانات في MongoDB هي حاوية فعلية للمجموعات. يمكن أن يحتوي خادم MongoDB على العديد من قواعد البيانات، وكل قاعدة بيانات تحتوي على مجموعة خاصة بها من المجموعات والمستخدمين.
# إنشاء قاعدة بيانات جديدة أو التبديل إلى قاعدة بيانات موجودة
use myDatabase
# عرض قاعدة البيانات الحالية
db
# عرض جميع قواعد البيانات
show dbs
قاعدة البيانات لن تظهر في قائمة قواعد البيانات (show dbs) حتى يتم إنشاء مجموعة واحدة على الأقل فيها.
المجموعة (Collection) في MongoDB هي مجموعة من وثائق MongoDB. وهي تعادل الجداول في قواعد البيانات العلائقية. المجموعات لا تفرض أي مخطط، مما يعني أن الوثائق داخل نفس المجموعة يمكن أن تحتوي على حقول مختلفة.
# إنشاء مجموعة جديدة
db.createCollection("users")
# عرض جميع المجموعات في قاعدة البيانات الحالية
show collections
يمكن أيضًا إنشاء مجموعة تلقائيًا عند إدراج وثيقة في مجموعة غير موجودة:
# إنشاء مجموعة تلقائيًا عند إدراج وثيقة
db.products.insertOne({ name: "Laptop", price: 999 })
الوثيقة (Document) هي مجموعة من أزواج المفتاح-القيمة. الوثائق لها بنية ديناميكية، مما يعني أن الوثائق في نفس المجموعة لا تحتاج إلى أن تكون متطابقة. الوثائق في MongoDB تشبه كائنات JSON ولكنها تُخزن في تنسيق BSON (Binary JSON).
// مثال لوثيقة MongoDB
{
_id: ObjectId("60f7b5b9e95f2b2b5c9e8b7a"),
name: "أحمد محمد",
email: "[email protected]",
age: 30,
address: {
city: "القاهرة",
country: "مصر"
},
hobbies: ["القراءة", "السفر", "البرمجة"],
active: true,
created_at: ISODate("2023-07-20T12:30:45.000Z")
}
كل وثيقة في MongoDB تحتوي على حقل خاص يسمى _id
يعمل كمعرف فريد للوثيقة. إذا لم تحدد قيمة لـ _id
عند إنشاء وثيقة، فسيقوم MongoDB تلقائيًا بإنشاء ObjectId فريد.
BSON (Binary JSON) هو تنسيق التشفير الثنائي المستخدم لتخزين الوثائق ونقلها في MongoDB. يوسع نموذج JSON ليدعم أنواع بيانات إضافية وليكون أكثر كفاءة في الحجم والسرعة.
على الرغم من أن BSON يدعم العديد من أنواع البيانات، إلا أن بعض لغات البرمجة قد لا تدعم جميع هذه الأنواع بشكل مباشر. تأكد من استخدام مكتبة MongoDB الرسمية للغة البرمجة الخاصة بك للتعامل مع هذه الأنواع بشكل صحيح.
عمليات CRUD (Create, Read, Update, Delete) هي العمليات الأساسية للتعامل مع البيانات في أي قاعدة بيانات. في MongoDB، يتم تنفيذ هذه العمليات باستخدام مجموعة من الدوال المتاحة في واجهة برمجة التطبيقات.
تستخدم عمليات الإنشاء لإدراج وثائق جديدة في مجموعة. هناك طريقتان رئيسيتان لإدراج البيانات في MongoDB:
// إدراج وثيقة واحدة
db.users.insertOne({
name: "محمد أحمد",
email: "[email protected]",
age: 28,
active: true
})
نتيجة العملية ستكون:
{
"acknowledged": true,
"insertedId": ObjectId("60f7b5b9e95f2b2b5c9e8b7a")
}
// إدراج عدة وثائق
db.products.insertMany([
{
name: "لابتوب",
price: 999,
category: "إلكترونيات"
},
{
name: "هاتف ذكي",
price: 699,
category: "إلكترونيات"
},
{
name: "سماعات",
price: 99,
category: "إكسسوارات"
}
])
نتيجة العملية ستكون:
{
"acknowledged": true,
"insertedIds": {
"0": ObjectId("60f7b5b9e95f2b2b5c9e8b7b"),
"1": ObjectId("60f7b5b9e95f2b2b5c9e8b7c"),
"2": ObjectId("60f7b5b9e95f2b2b5c9e8b7d")
}
}
عمليات القراءة تستخدم للبحث عن الوثائق واسترجاعها من المجموعات. MongoDB توفر عدة طرق للاستعلام عن البيانات.
// البحث عن جميع الوثائق في مجموعة
db.users.find()
// البحث عن وثائق تطابق شرطًا معينًا
db.users.find({ age: { $gt: 25 } })
// البحث عن وثائق تطابق عدة شروط
db.products.find({
category: "إلكترونيات",
price: { $lt: 800 }
})
// البحث عن أول وثيقة تطابق الشرط
db.users.findOne({ email: "[email protected]" })
// استرجاع حقول محددة فقط
db.users.find(
{ age: { $gt: 25 } }, // شرط البحث
{ name: 1, email: 1, _id: 0 } // الحقول المطلوبة (1 للإظهار، 0 للإخفاء)
)
// ترتيب النتائج تصاعديًا حسب السعر
db.products.find().sort({ price: 1 })
// ترتيب النتائج تنازليًا حسب السعر
db.products.find().sort({ price: -1 })
// استرجاع أول 5 وثائق
db.products.find().limit(5)
// تخطي أول 10 وثائق واسترجاع 5 التالية (مفيد للصفحات)
db.products.find().skip(10).limit(5)
يمكن استخدام سلسلة من العمليات معًا للحصول على نتائج أكثر تحديدًا:
db.products.find({ category: "إلكترونيات" })
.sort({ price: -1 })
.skip(5)
.limit(10)
عمليات التحديث تستخدم لتعديل الوثائق الموجودة في المجموعات. MongoDB توفر عدة طرق لتحديث البيانات.
// تحديث وثيقة واحدة
db.users.updateOne(
{ email: "[email protected]" }, // شرط البحث
{ $set: { age: 29, active: false } } // التحديثات المطلوبة
)
// تحديث عدة وثائق
db.products.updateMany(
{ category: "إلكترونيات" }, // شرط البحث
{ $inc: { price: 50 } } // زيادة السعر بمقدار 50
)
// استبدال وثيقة كاملة
db.users.replaceOne(
{ email: "[email protected]" }, // شرط البحث
{ // الوثيقة الجديدة بالكامل
name: "محمد علي",
email: "[email protected]",
age: 30,
address: {
city: "الرياض",
country: "السعودية"
},
active: true
}
)
يمكن استخدام خيار upsert: true
مع عمليات التحديث لإنشاء وثيقة جديدة إذا لم يتم العثور على وثيقة تطابق شرط البحث.
db.users.updateOne(
{ email: "[email protected]" },
{ $set: { name: "مستخدم جديد", age: 25 } },
{ upsert: true }
)
عمليات الحذف تستخدم لإزالة الوثائق من المجموعات. MongoDB توفر طريقتين رئيسيتين للحذف.
// حذف أول وثيقة تطابق الشرط
db.users.deleteOne({ email: "[email protected]" })
// حذف جميع الوثائق التي تطابق الشرط
db.products.deleteMany({ category: "إكسسوارات" })
// حذف جميع الوثائق في المجموعة
db.products.deleteMany({})
كن حذرًا عند استخدام deleteMany({})
لأنه سيحذف جميع الوثائق في المجموعة. تأكد من وجود نسخة احتياطية قبل تنفيذ عمليات الحذف الشاملة.
الفهارس (Indexes) في MongoDB تعمل بشكل مشابه للفهارس في قواعد البيانات العلائقية. فهي تحسن أداء عمليات البحث وتسمح بالاستعلامات الفعالة عن البيانات.
// إنشاء فهرس أحادي
db.users.createIndex({ email: 1 }) // 1 للترتيب التصاعدي، -1 للترتيب التنازلي
// إنشاء فهرس مركب (على عدة حقول)
db.products.createIndex({ category: 1, price: -1 })
// إنشاء فهرس فريد
db.users.createIndex({ email: 1 }, { unique: true })
// عرض جميع الفهارس في مجموعة
db.users.getIndexes()
// حذف فهرس محدد
db.users.dropIndex("email_1")
// حذف جميع الفهارس (باستثناء الفهرس الأساسي _id)
db.users.dropIndexes()
حذف الفهارس قد يؤثر سلباً على أداء الاستعلامات. تأكد من فهم تأثير حذف الفهارس قبل تنفيذ هذه العمليات في بيئة الإنتاج.
يوفر MongoDB إطار عمل قوي للتجميع (Aggregation) يسمح بمعالجة البيانات وتحويلها بطرق متقدمة. يمكن استخدام التجميع لحساب القيم الإجمالية، وتجميع الوثائق، وتنفيذ عمليات معقدة على البيانات.
يعتمد التجميع في MongoDB على مفهوم "خط الأنابيب" (Pipeline)، حيث تمر البيانات عبر مراحل متعددة، وكل مرحلة تقوم بتحويل البيانات بطريقة معينة.
db.products.aggregate([
{ $match: { active: true } },
{ $group: {
_id: "$category",
averagePrice: { $avg: "$price" },
count: { $sum: 1 }
}
},
{ $sort: { averagePrice: -1 } }
])
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $project: {
year: { $year: "$orderDate" },
month: { $month: "$orderDate" },
totalAmount: 1
}
},
{ $group: {
_id: { year: "$year", month: "$month" },
monthlySales: { $sum: "$totalAmount" },
orderCount: { $sum: 1 }
}
},
{ $sort: { "_id.year": 1, "_id.month": 1 } }
])
استخدم مرحلة $explain مع عمليات التجميع لفهم كيفية تنفيذها وتحسين أدائها: db.collection.aggregate([...], { explain: true })
منذ الإصدار 4.0، تدعم MongoDB المعاملات متعددة الوثائق (Multi-Document Transactions) التي تسمح بتنفيذ مجموعة من العمليات كوحدة واحدة، بحيث تنجح جميعها أو تفشل جميعها معاً.
المعاملات مفيدة في الحالات التي تتطلب الحفاظ على تناسق البيانات عبر عدة وثائق أو مجموعات، مثل:
// بدء جلسة
const session = db.getMongo().startSession();
// بدء المعاملة
session.startTransaction();
try {
// الحصول على مراجع للمجموعات في الجلسة
const accounts = session.getDatabase("finance").accounts;
// تنفيذ العمليات
accounts.updateOne(
{ _id: "account1" },
{ $inc: { balance: -100 } }
);
accounts.updateOne(
{ _id: "account2" },
{ $inc: { balance: 100 } }
);
// تأكيد المعاملة إذا نجحت جميع العمليات
session.commitTransaction();
} catch (error) {
// التراجع عن المعاملة في حالة حدوث خطأ
session.abortTransaction();
console.error("Error during transaction:", error);
} finally {
// إنهاء الجلسة
session.endSession();
}
المعاملات في MongoDB لها تأثير على الأداء، لذا استخدمها فقط عند الضرورة. في معظم الحالات، يمكن تصميم نموذج البيانات بطريقة تقلل من الحاجة إلى المعاملات.
يوفر MongoDB مجموعة شاملة من ميزات الأمان لحماية البيانات والتحكم في الوصول إليها. من المهم فهم وتطبيق هذه الميزات لضمان أمان قاعدة البيانات الخاصة بك.
المصادقة هي عملية التحقق من هوية المستخدمين. يدعم MongoDB عدة آليات للمصادقة:
// إنشاء مستخدم مع صلاحيات القراءة والكتابة على قاعدة بيانات محددة
db.createUser({
user: "appUser",
pwd: "securePassword",
roles: [{ role: "readWrite", db: "myDatabase" }]
})
التفويض هو عملية تحديد ما يمكن للمستخدمين المصادق عليهم القيام به. يستخدم MongoDB نموذج تفويض يعتمد على الأدوار (Role-Based Access Control).
يوفر MongoDB خيارات لتشفير البيانات أثناء النقل وأثناء التخزين:
يُنصح دائماً بتشغيل MongoDB في بيئة آمنة، وتعطيل الوصول العام، واستخدام جدران الحماية للتحكم في الوصول إلى خادم MongoDB.
تحسين أداء MongoDB يتضمن مجموعة من الممارسات والتقنيات التي تساعد على تحسين سرعة الاستعلامات وكفاءة استخدام الموارد.
الفهارس هي أهم أداة لتحسين أداء الاستعلامات في MongoDB. بعض النصائح لاستخدام الفهارس بشكل فعال:
// تحليل أداء استعلام
db.users.find({ age: { $gt: 25 } }).explain("executionStats")
تصميم مخطط البيانات (Schema Design) له تأثير كبير على أداء MongoDB:
لتحسين أداء عمليات الكتابة في MongoDB:
// مثال على عمليات الكتابة المجمعة
db.products.bulkWrite([
{ insertOne: { document: { name: "Product 1", price: 10 } } },
{ updateOne: {
filter: { _id: ObjectId("...") },
update: { $set: { price: 15 } }
}
},
{ deleteOne: { filter: { _id: ObjectId("...") } } }
])
استخدم أدوات مراقبة الأداء مثل MongoDB Compass وMongoDB Atlas لتحديد الاستعلامات البطيئة وتحسينها.
MongoDB Atlas هي خدمة قاعدة بيانات سحابية مُدارة بالكامل تقدمها شركة MongoDB. توفر Atlas طريقة سهلة لنشر وإدارة ومراقبة قواعد بيانات MongoDB في السحابة.
إنشاء حساب: قم بزيارة موقع MongoDB Atlas وإنشاء حساب مجاني.
إنشاء مجموعة: اختر مزود السحابة والمنطقة وحجم المجموعة.
تكوين الأمان: إنشاء مستخدم قاعدة البيانات وتكوين قائمة السماح لعناوين IP.
الاتصال بالمجموعة: استخدم سلسلة الاتصال المقدمة للاتصال من التطبيق الخاص بك.
// الاتصال باستخدام Node.js و Mongoose
const mongoose = require('mongoose');
mongoose.connect('mongodb+srv://username:[email protected]/myDatabase', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log('تم الاتصال بنجاح بـ MongoDB Atlas'))
.catch(err => console.error('خطأ في الاتصال:', err));
يوفر MongoDB Atlas طبقة مجانية تتضمن 512 ميجابايت من التخزين، وهي مناسبة للتعلم والمشاريع الصغيرة.