
دليل MongoDB: قواعد البيانات والمجموعات وQuery API وCRUD
MongoDBهو NoSQL database موجهة للوثائق يستخدم لتخزين البيانات في شكل مرن يشبه JSON documents. بدلاً من تنظيم المعلومات في الجداول والصفوف فقط، يقوم MongoDB بتخزين البيانات كـ documents داخل collections. وهذا يجعله مفيدًا للتطبيقات الحديثة حيث قد تتغير هياكل البيانات بمرور الوقت، مثل منصات الويب، وAPIs، ولوحات المعلومات، وأنظمة المحتوى، وتطبيقات التجارة الإلكترونية، وأدوات التحليلات، والخدمات في الوقت الفعلي.
تعمل هذه المقالة كمقدمة تفصيلية لموضوعات MongoDB الموضحة في مسار التعلم: MongoDB الصفحة الرئيسية، البدء، Query API، إنشاء قاعدة بيانات، إنشاء collection، إدراج، بحث، تحديث، وحذف. الهدف ليس فقط إظهار commands، ولكن أيضًا شرح كيفية تفكير MongoDB في البيانات وكيف يجب على المطورين استخدامها في المشاريع الحقيقية.
إذا كنت تعرف SQL بالفعل، فقد تشعر أن MongoDB مختلف في البداية. SQL databases يبدأ عادةً بـ schema الصارم والجداول والصفوف والأعمدة والصلات والقيود العلائقية. يبدأ MongoDB بـ documents، وcollections، والحقول المرنة، والبيانات المضمنة، والمراجع، وindexes، ولغة استعلام تعتمد على الكائنات المنظمة. يمكن أن يكون كلا النهجين قويين، لكنهما يحلان المشكلات بطرق مختلفة.
ما هو MongoDB؟
MongoDB هو NoSQL database الذي يقوم بتخزين البيانات كـ documents. document هو كائن منظم مكون من حقول وقيم. يشبه تنسيق document تنسيق JSON، ولكن داخليًا يستخدم MongoDB تنسيقًا ثنائيًا يسمى BSON. يدعم BSON أنواع البيانات الإضافية مثل ObjectId، وDate، وDecimal128، وBinary، وأنواع أخرى مفيدة لتخزين database.
يمكن أن يبدو MongoDB document البسيط كما يلي:
{
"_id": ObjectId("665f2a1b8f2c9a0012a45c91"),
"name": "Adnan",
"email": "adnan@example.com",
"role": "developer",
"active": true,
"skills": ["PHP", "Laravel", "MongoDB"],
"profile": {
"city": "Samsun",
"country": "Turkey"
},
"createdAt": ISODate("2026-06-11T00:00:00Z")
}يحتوي document على حقول عادية مثل الاسم والبريد الإلكتروني، وحقل مصفوفة يسمى المهارات، وكائن مضمن يسمى ملف التعريف. هذه إحدى نقاط القوة الرئيسية لـ MongoDB: يمكن تخزين البيانات ذات الصلة معًا عند قراءتها معًا عادةً.
في database العلائقية، قد يتم تقسيم نفس المعلومات إلى جداول متعددة مثل المستخدمين ومهارات المستخدم وملفات تعريف المستخدم. في MongoDB، يمكن تضمين البيانات داخل مستخدم واحد document إذا كانت هذه البنية تجعل التطبيق أسهل وأسرع في القراءة.
MongoDB الصفحة الرئيسية: الصورة الكبيرة
يبدأ مسار التعلم MongoDB عادةً بالصورة الكبيرة. قبل كتابة commands، من المهم فهم العناصر الأساسية.
قاعدة البيانات:حاوية لـ collections. على سبيل المثال، قد يستخدم التطبيق مدونة أو متجر أو مدرسة أو إدارة علاقات العملاء باسم database.
المجموعة:مجموعة من documents. إنه مشابه للجدول الموجود في SQL، لكنه لا يتطلب أن يحتوي كل document على نفس الحقول تمامًا.
الوثيقة:سجل واحد مخزن ككائن BSON. إنه مشابه للصف في SQL، لكنه يمكن أن يحتوي على كائنات ومصفوفات متداخلة.
المجال:مفتاح داخل document. وهو مشابه لاسم العمود في SQL.
_المعرف:تتم إضافة معرف فريد تلقائيًا إلى كل document ما لم تقم بتوفير القيمة الفريدة الخاصة بك.
الاستعلام:يستخدم request للبحث عن documents أو تصفيته أو تحديثه أو حذفه.
الفهرس:بنية بيانات تساعد MongoDB في العثور على documents بشكل أسرع.
تساعد المقارنة التالية مطوري SQL على فهم مصطلحات MongoDB.
SQL Database → MongoDB Database
SQL Table → MongoDB Collection
SQL Row → MongoDB Document
SQL Column → MongoDB Field
Primary Key → _id
WHERE condition → Query filter
JOIN → Embedding, references, or $lookup
INSERT → insertOne() / insertMany()
SELECT → find() / findOne()
UPDATE → updateOne() / updateMany()
DELETE → deleteOne() / deleteMany()MongoDB ليس أفضل من SQL في كل موقف، وSQL ليس أفضل من MongoDB في كل موقف. يعتمد الاختيار الصحيح على البيانات model ومتطلبات الاتساق واحتياجات إعداد التقارير واحتياجات قابلية التوسع وكيفية قراءة التطبيق للبيانات وكتابتها.
MongoDB ابدأ
للبدء في استخدام MongoDB، يحتاج المطورون عادةً إلى ثلاثة أشياء: خادم MongoDB، وطريقة للاتصال بالخادم، وأداة أو برنامج تشغيل لتشغيل commands.
يمكنك استخدام MongoDB بطرق مختلفة:
أطلس MongoDB:خدمة database السحابية المُدارة. يكون ذلك مفيدًا عندما لا ترغب في إدارة خادم database بنفسك.
خادم MongoDB المحلي:يتم تثبيته مباشرة على جهاز الكمبيوتر أو الخادم الخاص بك للتطوير والاختبار.
عامل ميناء:مفيد للتطوير المحلي لأنه يمكن تشغيل MongoDB داخل الحاوية.
البوصلة MongoDB:interface رسومية لعرض databases وcollections وdocuments وindexes.
مونغوش:يستخدم MongoDB Shell لتشغيل database commands من المحطة.
برامج تشغيل التطبيق:المكتبات الرسمية التي تسمح لـ Node.js وPHP وPython وJava وC# وGo واللغات الأخرى بالتواصل مع MongoDB.
يمكن بدء تشغيل خادم MongoDB المحلي باستخدام Docker على النحو التالي:
docker run --name mongodb-demo -p 27017:27017 -d mongoثم يمكنك الاتصال باستخدام mongosh:
mongosh "mongodb://localhost:27017"داخل mongosh، يمكنك التحقق من database الحالي باستخدام:
dbيمكنك إدراج databases المتاحة مع:
show dbsفي البداية، قد لا يُظهر MongoDB database حتى يتم إدراج البيانات فيه فعليًا. وهذا أمر طبيعي لأن MongoDB ينشئ databases وcollections بتكاسل. من الناحية العملية، هذا يعني أن database أو collection يصبح حقيقيًا عندما يتلقى البيانات أو يتم إنشاؤه بشكل صريح.
سلسلة الاتصال MongoDB
تتصل التطبيقات عادةً بـ MongoDB باستخدام سلسلة اتصال. تبدو سلسلة الاتصال المحلية الأساسية كما يلي:
mongodb://localhost:27017قد تبدو سلسلة الاتصال مع المصادقة كما يلي:
mongodb://username:password@localhost:27017/app_dbفي المشاريع الحقيقية، لا ينبغي أن تكون سلاسل الاتصال مشفرة بشكل ثابت داخل ملفات التطبيق. يجب أن يتم تخزينها في متغيرات البيئة، على سبيل المثال في ملف.envتكوين الملف أو الخادم.
MONGODB_URI=mongodb://localhost:27017
MONGODB_DATABASE=app_dbوهذا يحافظ على أمان بيانات الاعتماد ويسهل استخدام databases المختلفة للتطوير المحلي والاختبار والتجهيز والإنتاج.
MongoDB Query API
الMongoDB Query APIهي الطريقة التي يقرأ بها المطورون البيانات ويكتبونها في MongoDB. على عكس SQL، تتم كتابة استعلامات MongoDB عادةً ككائنات منظمة. تصف هذه الكائنات عوامل التصفية وعمليات التحديث والإسقاطات وقواعد الفرز ومراحل aggregation وعمليات database الأخرى.
على سبيل المثال، قد يبدو الاستعلام SQL كما يلي:
SELECT name, email
FROM users
WHERE active = true
ORDER BY created_at DESC
LIMIT 10;يمكن أن يبدو إصدار MongoDB كما يلي:
db.users.find(
{ active: true },
{ name: 1, email: 1 }
).sort({ createdAt: -1 }).limit(10)الكائن الأول هو الفلتر:
{ active: true }الكائن الثاني هو الإسقاط:
{ name: 1, email: 1 }تستخدم قاعدة الفرز-1للترتيب التنازلي و1للترتيب التصاعدي:
{ createdAt: -1 }يتضمن Query API أنواعًا مختلفة من العمليات:
قراءة العمليات:ابحث عن documents باستخدام عوامل التصفية والإسقاطات والفرز والحدود وترقيم الصفحات.
عمليات الكتابة:إدراج وتحديث واستبدال وحذف documents.
عمليات التجميع:تحويل البيانات وتجميعها وضمها وحسابها وإعادة تشكيلها باستخدام pipelines.
عمليات الفهرس:إنشاء وإدارة indexes للأداء.
قاعدة البيانات وعمليات collection:أنشئ collections، وأدرج collections، وأسقط collections، وأدر قواعد validation.
يعد Query API معبرًا لأن المرشحات يمكن أن تحتوي على operators. تشمل query operators الشائعة ما يلي:
مكافئ $:يساوي قيمة.
$ني:لا يساوي.
$gt:أكبر من.
$GTE:أكبر من أو يساوي.
$lt:أقل من.
$LTE:أقل من أو يساوي.
$في:القيمة موجودة داخل القائمة.
تسعة دولارات:القيمة غير موجودة داخل القائمة.
$ و:الجمع بين شروط متعددة حيث يجب أن يكون كل شيء صحيحًا.
$أو:الجمع بين عدة شروط حيث يجب أن يكون شرط واحد على الأقل صحيحًا.
$ موجود:تحقق مما إذا كان هناك حقل.
التعبير العادي $:مطابقة النص باستخدام التعبير العادي.
على سبيل المثال، يبحث هذا الاستعلام عن المستخدمين النشطين الذين لا يقل عمرهم عن 18 عامًا:
db.users.find({
active: true,
age: { $gte: 18 }
})يبحث هذا الاستعلام عن المستخدمين الذين يكون دورهم إما مسؤولًا أو محررًا:
db.users.find({
role: { $in: ["admin", "editor"] }
})يبحث هذا الاستعلام عن المستخدمين النشطين أو الذين تم التحقق منهم:
db.users.find({
$or: [
{ active: true },
{ verified: true }
]
})يعتبر Query API أساس تطوير MongoDB. تعتمد عمليات الإدراج والبحث والتحديث والحذف جميعها على فهم كيفية عمل المرشحات وهياكل document.
MongoDB إنشاء قاعدة البيانات
يختلف إنشاء database في MongoDB عن إنشاء database في العديد من أنظمة SQL. في MongoDB، يمكنك التبديل إلى database حتى لو لم يكن موجودًا بعد. يتم إنشاء database فعليًا عند إدراج البيانات فيه أو إنشاء collection بشكل صريح.
للتبديل إلى database المسمىblog_db، استخدم:
use blog_dbيشير الغلاف الآن إلى blog_db، ولكن قد لا يظهر database فيعرض ديسيبلحتى تحتوي على بيانات.
أدخل document لإنشاء database تلقائيًا:
db.posts.insertOne({
title: "Learning MongoDB",
slug: "learning-mongodb",
status: "published",
createdAt: new Date()
})الآن يمكنك تشغيل:
show dbsيجب أن يظهر database لأنه يحتوي الآن على collection وdocument.
يعتبر سلوك الإنشاء البطيء هذا ملائمًا للتطوير، ولكن في مرحلة الإنتاج، يجب على مطوري البرامج تخطيط أسماء database وأسماء collection وقواعد indexes وvalidation والمستخدمين والأذونات وسياسات النسخ الاحتياطي بعناية.
أفضل ممارسات تسمية قاعدة البيانات
يجب أن تكون أسماء قواعد البيانات واضحة ومستقرة. يصف اسم database الجيد التطبيق أو الخدمة التي تمتلك البيانات.
استخدم أسماء واضحة مثلblog_db,shop_db,crm_dbأوanalytics_db.
تجنب الأسماء العشوائية التي لا تشرح الغرض من database.
تجنب استخدام نفس database للتطبيقات غير ذات الصلة.
استخدم databases أو بيئات منفصلة للتطوير والاختبار والتجهيز والإنتاج.
لا تقم بتخزين بيانات اعتماد الإنتاج مباشرة داخل ملفات الكود.
قد يستخدم المشروع النموذجي أسماء database مختلفة لكل بيئة:
app_local
app_testing
app_staging
app_productionيساعد هذا الفصل على منع عمليات الاختبار غير المقصودة من إتلاف بيانات الإنتاج.
مجموعة MongoDB
أcollectionهي مجموعة من MongoDB documents. وهو مشابه للجدول الموجود في SQL، ولكنه أكثر مرونة. يمكن أن تحتوي المستندات الموجودة داخل نفس collection على مجالات مختلفة، على الرغم من أنه في التطبيقات الاحترافية، لا يزال من الأفضل الحفاظ على بنية متسقة.
على سبيل المثال، قد يحتوي المستخدم collection على documents مثل هذا:
{
"_id": ObjectId("665f2a1b8f2c9a0012a45c91"),
"name": "Adnan",
"email": "adnan@example.com",
"role": "admin",
"active": true
}وقد يتضمن document آخر في نفس collection حقولًا إضافية:
{
"_id": ObjectId("665f2a1b8f2c9a0012a45c92"),
"name": "Sara",
"email": "sara@example.com",
"role": "editor",
"active": true,
"profile": {
"city": "Istanbul",
"country": "Turkey"
},
"skills": ["Writing", "SEO", "Content Management"]
}يسمح MongoDB بهذه المرونة، لكن المرونة لا تعني الفوضى. في التطبيقات الحقيقية، يجب عليك تصميم documents بعناية. يجب أن يكون لـ collection غرض واضح، ويجب أن يتبع documents بداخله عادةً بنية يمكن التنبؤ بها.
يمكنك إنشاء collection بشكل صريح:
db.createCollection("users")يمكنك أيضًا إنشاء collection تلقائيًا عن طريق إدخال document الأول:
db.products.insertOne({
name: "Wireless Mouse",
price: 25,
stock: 100
})بعد إدراج document، يقوم MongoDB بإنشاء المنتجات collection إذا لم تكن موجودة بالفعل.
أفضل ممارسات تسمية المجموعة
يجب أن تكون أسماء المجموعات بسيطة وسهلة القراءة ومتسقة. تستخدم العديد من الفرق أسماء الجمع لأن collection يحتوي على العديد من documents.
استخدم أسماء مثلالمستخدمين,المشاركات,أوامر,المنتجات,تعليقات، وclasses.
حافظ على اتساق أسلوب التسمية عبر المشروع.
تجنب الأسماء الغامضة مثلdata,العناصرأوالسجلاتإلا إذا كانوا يصفون المجال حقًا.
لا تخلط أنواع document غير المرتبطة في نفس collection فقط لأن MongoDB مرن.
قم بإنشاء indexes استنادًا إلى كيفية قيام التطبيق بالاستعلام عن collection.
على سبيل المثال، قد يحتوي تطبيق المدونة على collections مثل:
users
posts
categories
tags
comments
media
settingsقد يحتوي تطبيق التجارة الإلكترونية على:
customers
products
orders
payments
shipments
reviews
couponsتصميم المخطط في MongoDB
MongoDB هو schema مرن، وليس خاليًا من schema بالمعنى العملي. لا يفرض database على كل document أن يبدو متماثلًا تمامًا بشكل افتراضي، ولكن يجب أن يظل التطبيق يتبع بيانات واضحة model.
أهم سؤال حول تصميم schema في MongoDB هو ما إذا كان يجب تضمين البيانات ذات الصلة داخل document أو الرجوع إليها من collection آخر.
تضمين البيانات
التضمين يعني تخزين البيانات ذات الصلة داخل نفس document. يكون هذا مفيدًا عندما تنتمي البيانات المضمنة بقوة إلى الأصل document ويتم قراءتها معها عادةً.
{
"title": "MongoDB Basics",
"slug": "mongodb-basics",
"author": {
"name": "Adnan",
"email": "adnan@example.com"
},
"tags": ["mongodb", "database", "nosql"]
}يمكن أن يؤدي التضمين إلى تقليل الحاجة إلى استعلامات إضافية لأن البيانات موجودة بالفعل داخل document.
البيانات المرجعية
المرجع يعني تخزين معرف يشير إلى document آخر، على غرار فكرة المفتاح الخارجي في SQL، على الرغم من أن MongoDB لا يتصرف تمامًا مثل databases الارتباطي بشكل افتراضي.
{
"title": "MongoDB Basics",
"slug": "mongodb-basics",
"authorId": ObjectId("665f2a1b8f2c9a0012a45c91"),
"tags": ["mongodb", "database", "nosql"]
}يكون المرجع مفيدًا عندما تكون البيانات ذات الصلة كبيرة، أو يعاد استخدامها في العديد من الأماكن، أو يتم تحديثها بشكل متكرر، أو يجب أن تظل منفصلة لأسباب تجارية.
القاعدة البسيطة هي: تضمين البيانات المملوكة للوالد وقراءتها معًا؛ البيانات المرجعية المشتركة أو الكبيرة أو المستقلة أو المحدثة بشكل منفصل.
إدراج MongoDB
تقوم عمليات الإدراج بإضافة documents جديد إلى collection. يوفر MongoDB طرق إدراج مختلفة، ولكن الأكثر شيوعًا هيإدراج واحد ()وإدراج كثير ().
إدراج واحد ()
الإدراج واحد ()تقوم الطريقة بإدراج document واحد.
db.users.insertOne({
name: "Adnan",
email: "adnan@example.com",
role: "admin",
active: true,
createdAt: new Date()
})إذا لم تقم بتوفير_idالحقل، يقوم MongoDB بإنشاء واحد تلقائيًا. القيمة الافتراضية هي عادةً ObjectId.
تحتوي النتيجة عادةً على حالة الإقرار والمعرف المدرج:
{
acknowledged: true,
insertedId: ObjectId("665f2a1b8f2c9a0012a45c91")
}إدراج كثير ()
الإدراج كثير ()تقوم الطريقة بإدراج عدة documents مرة واحدة.
db.users.insertMany([
{
name: "Sara",
email: "sara@example.com",
role: "editor",
active: true,
createdAt: new Date()
},
{
name: "Omar",
email: "omar@example.com",
role: "user",
active: false,
createdAt: new Date()
}
])تكون الإدخالات المجمعة مفيدة عند استيراد البيانات الأولية أو السجلات أو المنتجات أو الرسائل أو سجلات التحليلات أو بيانات الترحيل.
قواعد إدراج هامة
عند إدراج documents، ضع هذه القواعد في الاعتبار:
يجب أن يكون لكل document رقم فريد_id.
إذا_idلم يتم توفيره، يقوم MongoDB بإنشائه تلقائيًا.
يمكن أن تحتوي المستندات الموجودة في نفس collection على حقول مختلفة، ولكن البنية المتسقة أفضل لقابلية الصيانة.
استخدم أنواع البيانات الصحيحة من البداية، خاصة بالنسبة للتواريخ والأرقام والقيم المنطقية والمعرفات.
لا تقم بتخزين كلمات المرور كنص عادي. قم دائمًا بتجزئة كلمات المرور في التطبيق قبل تخزينها.
تجنب تخزين صفائف ضخمة غير محدودة داخل document واحد لأن documents لها حدود للحجم ويمكن أن تصبح غير فعالة.
يجب على المستخدم الجيد document تجنب الغموض غير الضروري:
db.users.insertOne({
name: "Adnan",
email: "adnan@example.com",
role: "admin",
active: true,
loginCount: 0,
createdAt: new Date(),
updatedAt: new Date()
})يستخدم document قيمًا منطقية للحالة، وقيمًا رقمية للعدادات، وقيم التاريخ للطوابع الزمنية. وهذا يجعل الاستعلامات والتحديثات المستقبلية أسهل.
MongoDB ابحث عن
ابحث عن العمليات المقروءة documents من collection. الطريقتان الأكثر شيوعًا هماتجد ()وFindOne().
تجد ()
التجد ()تقوم الطريقة بإرجاع جميع documents المطابقة.
db.users.find()يقوم command بإرجاع documents من المستخدمين collection. في التطبيقات الحقيقية، يجب عليك عادةً استخدام المرشحات والإسقاطات والفرز والحدود بدلاً من قراءة كل شيء.
البحث عن المستخدمين النشطين:
db.users.find({
active: true
})ابحث عن المستخدمين الذين لديهم دور المشرف:
db.users.find({
role: "admin"
})ابحث عن المستخدمين الأكبر من أو يساوي 18 عامًا:
db.users.find({
age: { $gte: 18 }
})FindOne()
الFindOne()ترجع الطريقة واحدة مطابقة document.
db.users.findOne({
email: "adnan@example.com"
})يعد هذا مفيدًا عند البحث باستخدام حقل فريد مثل البريد الإلكتروني أو اسم المستخدم أو الارتباط الثابت أو _id.
البحث مع الإسقاط
يتحكم الإسقاط في الحقول التي يتم إرجاعها. يكون هذا مفيدًا عندما يحتوي document على العديد من الحقول ولكن التطبيق يحتاج فقط إلى بعضها.
db.users.find(
{ active: true },
{ name: 1, email: 1, role: 1 }
)يؤدي هذا إلى إرجاع الاسم والبريد الإلكتروني والدور و_id فقط بشكل افتراضي. إذا كنت لا تريد _id، فاضبطه على 0:
db.users.find(
{ active: true },
{ _id: 0, name: 1, email: 1, role: 1 }
)يعمل العرض على تحسين الوضوح ويمكن أن يقلل من نقل الشبكة عندما يكون حجم documents كبيرًا.
البحث باستخدام الفرز والحد والتخطي
يتحكم الفرز في ترتيب documents الذي تم إرجاعه.
db.users.find().sort({ createdAt: -1 })يتحكم الحد في عدد documents التي يتم إرجاعها.
db.users.find().limit(10)يمكن استخدام Skip لترقيم الصفحات البسيط:
db.users.find()
.sort({ createdAt: -1 })
.skip(20)
.limit(10)يؤدي هذا إلى إرجاع نتائج تشبه الصفحة، لكن قيم التخطي الكبيرة قد تصبح غير فعالة. بالنسبة لمجموعات البيانات الكبيرة، عادةً ما يكون ترقيم الصفحات المستند إلى المؤشر باستخدام الحقول المفهرسة مثل _id أو createAt أفضل.
البحث باستخدام العوامل المنطقية
ال$ ويتطلب operator أن تكون جميع الشروط صحيحة.
db.users.find({
$and: [
{ active: true },
{ role: "editor" }
]
})في كثير من الحالات، يسمح MongoDB بصيغة أقصر:
db.users.find({
active: true,
role: "editor"
})ال$ أويتطلب operator شرطًا واحدًا على الأقل ليكون صحيحًا.
db.users.find({
$or: [
{ role: "admin" },
{ role: "editor" }
]
})ال$ فيغالبًا ما يكون operator أكثر وضوحًا عند التحقق من حقل واحد مقابل قيم متعددة:
db.users.find({
role: { $in: ["admin", "editor"] }
})ابحث في المصفوفات والمستندات المتداخلة
يمكن لـ MongoDB الاستعلام عن حقول المصفوفة مباشرةً. على سبيل المثال، ابحث عن المستخدمين الذين لديهم MongoDB في مهاراتهم:
db.users.find({
skills: "MongoDB"
})يمكن لـ MongoDB أيضًا الاستعلام عن الحقول المتداخلة باستخدام التدوين النقطي:
db.users.find({
"profile.city": "Samsun"
})يعد هذا أحد الأسباب التي تجعل MongoDB مفيدًا للبيانات المستندة إلى document models. يمكن الاستعلام عن البيانات المتداخلة دون تقسيم كل شيء يدويًا إلى العديد من الجداول.
تحديث MongoDB
تقوم عمليات التحديث بتعديل documents الموجود. يوفر MongoDB العديد من طرق التحديث، بما في ذلكتحديث واحد (),تحديث كثير ()، واستبدال واحد ().
القاعدة الأكثر أهمية هي: في معظم الحالات، استخدم update operators مثلمجموعة $,$inc,$دفع,$addToSet، و$ غير محدد. لا تقم باستبدال document بالكامل عن طريق الخطأ عندما تريد تغيير حقل واحد فقط.
تحديث واحد ()
التحديث واحد ()يقوم الأسلوب بتحديث document الأول الذي يطابق عامل التصفية.
db.users.updateOne(
{ email: "adnan@example.com" },
{
$set: {
role: "admin",
updatedAt: new Date()
}
}
)الكائن الأول هو المرشح. يصف الكائن الثاني عملية التحديث. هنا،مجموعة $يغير فقط الدور والحقول المحدثة.
تحديث كثير ()
التحديث كثير ()يقوم الأسلوب بتحديث كافة documents التي تطابق عامل التصفية.
db.users.updateMany(
{ active: false },
{
$set: {
status: "inactive",
updatedAt: new Date()
}
}
)استخدم التحديث بعناية. قم دائمًا باختبار عامل التصفية أولاً باستخدام find() قبل تشغيل تحديث كبير.
db.users.find({ active: false })بعد التأكد من مجموعة النتائج، قم بتشغيل التحديث.
مشغلي التحديث المشترك
MongoDB update operators تسمح بإجراء تعديلات دقيقة.
مجموعة $
تعيين قيم الحقول أو تغييرها:
db.users.updateOne(
{ email: "sara@example.com" },
{ $set: { active: true } }
)$ غير محدد
إزالة حقل من document:
db.users.updateOne(
{ email: "sara@example.com" },
{ $unset: { temporaryToken: "" } }
)$inc
زيادة أو تقليل قيمة رقمية:
db.users.updateOne(
{ email: "adnan@example.com" },
{ $inc: { loginCount: 1 } }
)$دفع
إضافة قيمة إلى مصفوفة:
db.users.updateOne(
{ email: "adnan@example.com" },
{ $push: { skills: "Node.js" } }
)$addToSet
أضف قيمة إلى المصفوفة فقط إذا لم تكن موجودة بالفعل:
db.users.updateOne(
{ email: "adnan@example.com" },
{ $addToSet: { skills: "MongoDB" } }
)الفرق بين$دفعو$addToSetيهم.$دفعيمكن إنشاء قيم مكررة، في حين$addToSetيتجنب التكرارات لنفس القيمة.
تم رفعه في MongoDB
يعني upsert التحديث في حالة وجود document، أو إدراج document جديد في حالة عدم وجوده. يعد هذا مفيدًا للإعدادات والعدادات ومهام المزامنة والمعرفات الخارجية والعمليات غير الفعالة.
db.users.updateOne(
{ email: "newuser@example.com" },
{
$set: {
name: "New User",
role: "user",
active: true,
updatedAt: new Date()
},
$setOnInsert: {
createdAt: new Date()
}
},
{ upsert: true }
)هنا،مجموعة $ينطبق على التحديث أو الإدراج، في حين$setOnInsertينطبق فقط عند إنشاء document جديد.
استبدال واحد ()
الاستبدال واحد ()يستبدل الأسلوب document المطابق بالكامل باستثناء حقل _id. ويجب استخدامه فقط عندما تريد عن قصد استبدال بنية document الكاملة.
db.users.replaceOne(
{ email: "adnan@example.com" },
{
name: "Adnan Mehrat",
email: "adnan@example.com",
role: "admin",
active: true,
updatedAt: new Date()
}
)كن حذرًا: يمكن إزالة الحقول غير المدرجة في الاستبدال document. بالنسبة إلى معظم التغييرات العادية، يكون UpdateOne() مع $set أكثر أمانًا من ReplaceOne().
حذف MongoDB
تقوم عمليات الحذف بإزالة documents من collection. يوفر MongoDBحذف واحد ()وحذف كثير ().
حذف واحد ()
الحذف واحد ()يحذف الأسلوب document الأول الذي يطابق عامل التصفية.
db.users.deleteOne({
email: "omar@example.com"
})يعد هذا مفيدًا عند الحذف بواسطة حقل فريد مثل _id أو البريد الإلكتروني.
حذف كثير ()
الحذف كثير ()يحذف الأسلوب كافة documents التي تطابق عامل التصفية.
db.users.deleteMany({
active: false
})قبل استخدام ()deleteMany، قم دائمًا بتشغيل find () بنفس عامل التصفية لتأكيد documents الذي ستتم إزالته.
db.users.find({
active: false
})ثم قم بتشغيلdeleteMany() فقط بعد التأكد.
عمليات الحذف الخطيرة
أخطر حذف command هو مرشح فارغ:
db.users.deleteMany({})يؤدي هذا إلى حذف جميع documents لدى المستخدمين collection. قد يكون مفيدًا في التطوير أو الاختبار، لكنه خطير في الإنتاج.
يعد إسقاط collection بالكامل أمرًا مدمرًا أيضًا:
db.users.drop()يعد إسقاط database أكثر خطورة:
db.dropDatabase()يجب أن تحمي أنظمة الإنتاج العمليات المدمرة باستخدام النسخ الاحتياطية والأذونات والبرامج النصية الدقيقة وعمليات المراجعة والمراقبة.
الحذف الناعم بدلاً من الحذف الصعب
تتجنب العديد من التطبيقات حذف السجلات المهمة على الفور. بدلاً من ذلك، يستخدمون أسلوب الحذف الناعم. وهذا يعني أن document يظل في database، ولكن تم وضع علامة عليه كمحذوف.
db.users.updateOne(
{ email: "sara@example.com" },
{
$set: {
deletedAt: new Date(),
active: false
}
}
)ثم تستبعد الاستعلامات العادية documents المحذوفة:
db.users.find({
deletedAt: { $exists: false }
})يُعد الحذف المبسط مفيدًا لمسارات التدقيق واستعادة الميزات ومراجعة المسؤول واحتياجات الامتثال وتجنب الخسارة الدائمة غير المقصودة.
مثال CRUD كامل
يوضح المثال التالي سير عمل MongoDB صغير من تحديد database للإدراج والبحث والتحديث والحذف.
use tutorial_db
db.users.insertOne({
name: "Adnan",
email: "adnan@example.com",
role: "developer",
active: true,
skills: ["PHP", "Laravel"],
loginCount: 0,
createdAt: new Date(),
updatedAt: new Date()
})
db.users.findOne({
email: "adnan@example.com"
})
db.users.updateOne(
{ email: "adnan@example.com" },
{
$set: {
role: "admin",
updatedAt: new Date()
},
$addToSet: {
skills: "MongoDB"
},
$inc: {
loginCount: 1
}
}
)
db.users.find(
{ active: true },
{ name: 1, email: 1, role: 1, skills: 1 }
).sort({ createdAt: -1 }).limit(10)
db.users.deleteOne({
email: "adnan@example.com"
})يوضح هذا المثال التدفق الأساسي المستخدم في كل تطبيق MongoDB تقريبًا. قد يضيف النظام الحقيقي المصادقة، validation، indexes، والمعاملات، والنسخ الاحتياطية، والخدمات على مستوى التطبيق، ولكن عمليات CRUD تظل هي الأساس.
MongoDB والفهارس: ملاحظة عملية
على الرغم من أن indexes ليست الموضوع الرئيسي لهذه المقالة، إلا أنها مهمة لأداء MongoDB الحقيقي. بدون indexes، قد يحتاج MongoDB إلى فحص العديد من documents للعثور على نتائج مطابقة. باستخدام indexes المناسب، يمكن أن تصبح الاستعلامات أسرع بكثير.
على سبيل المثال، إذا كان المستخدمون يتم البحث عنهم غالبًا عبر البريد الإلكتروني، فقم بإنشاء index:
db.users.createIndex({ email: 1 }, { unique: true })يساعد index MongoDB في العثور على المستخدمين عبر البريد الإلكتروني بشكل أسرع ويمنع أيضًا قيم البريد الإلكتروني المكررة.
إذا كانت المشاركات مدرجة غالبًا حسب الحالة وتاريخ الإنشاء، فقد يساعد مركب index:
db.posts.createIndex({ status: 1, createdAt: -1 })يجب أن تعتمد الفهارس على أنماط استعلام حقيقية. عدد قليل جدًا من indexes يمكن أن يجعل القراءة بطيئة، في حين أن الكثير من indexes يمكن أن يجعل الكتابة أثقل ويزيد من استخدام مساحة التخزين.
التحقق من صحة MongoDB: الحفاظ على نظافة البيانات المرنة
يسمح MongoDB بـ documents المرن، لكن الأنظمة الاحترافية غالبًا ما تحتاج إلى validation. يمكن أن تساعد المجموعة validation في فرض الحقول المطلوبة وأنواع الحقول والبنية الأساسية.
على سبيل المثال، يمكنك إنشاء مستخدمين collection باستخدام validation البسيط:
db.createCollection("users_validated", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email", "role"],
properties: {
name: {
bsonType: "string"
},
email: {
bsonType: "string"
},
role: {
enum: ["admin", "editor", "user"]
},
active: {
bsonType: "bool"
}
}
}
}
})لا يحل هذا محل التطبيق validation، ولكنه يضيف طبقة أخرى من الحماية على مستوى database. في التطبيقات الجادة، يجب أن يكون validation موجودًا في كل من التطبيق وdatabase حيثما كان ذلك مناسبًا.
الأخطاء الشائعة عند تعلم MongoDB
غالبًا ما يرتكب المبتدئون الأخطاء لأن MongoDB يبدو بسيطًا في البداية. من السهل كتابة commands، لكن نمذجة البيانات الجيدة لا تزال تتطلب الانضباط.
استخدام MongoDB مثل database العلائقية:قد تؤدي إعادة إنشاء العديد من الجداول والروابط ذات النمط SQL إلى تجاهل فوائد MongoDB document model.
تضمين الكثير من البيانات:يمكن أن يصبح من الصعب تحديث المصفوفات المتداخلة الضخمة أو الهياكل المضمنة الكبيرة وتكون غير فعالة.
تجاهل indexes:قد تعمل الاستعلامات مع البيانات الصغيرة ولكنها تصبح بطيئة عندما ينمو collections.
استخدام أسماء الحقول غير المتناسقة:يؤدي المزج بين create_at وcreateAt وcreate_date وdateCreated إلى جعل صيانة الكود أكثر صعوبة.
تخزين أنواع البيانات الخاطئة:تخزين الأرقام كسلاسل أو تواريخ كنص عادي يجعل التصفية والفرز أكثر صعوبة.
تشغيل updateMany أوdeleteMany دون اختبار:قد تؤدي عمليات الكتابة الكبيرة إلى إتلاف البيانات إذا كان عامل التصفية خاطئًا.
إهمال الأمن:يجب أن تستخدم قواعد البيانات المصادقة وقيود الشبكة والمستخدمين ذوي الامتيازات الأقل والنسخ الاحتياطية.
أفضل طريقة لتجنب هذه الأخطاء هي تصميم collections استنادًا إلى حالات استخدام التطبيق، واختبار الاستعلامات ببيانات واقعية، والتعامل مع MongoDB باعتباره نظام database جادًا، وليس مجرد أداة تخزين JSON المرنة.
متى يجب عليك استخدام MongoDB؟
يعد MongoDB خيارًا قويًا عندما يحتاج التطبيق إلى documents المرن، والتكرار السريع، والبيانات المتداخلة، وحجم الكتابة المرتفع، والبنية القابلة للتطوير، وهياكل البيانات التي لا تتلاءم بشكل طبيعي مع الجداول العلائقية الصارمة.
تشمل حالات الاستخدام الشائعة ما يلي:
أنظمة إدارة المحتوى.
ملفات تعريف المستخدمين ذات السمات المرنة.
كتالوجات المنتجات بمواصفات المنتج المختلفة.
سجلات الأحداث وتدفقات النشاط.
لوحات المعلومات في الوقت الحقيقي.
الخلفيات الخلفية لتطبيقات الهاتف المحمول والويب.
التحليلات والبيانات شبه المنظمة.
رسائل الدردشة وأنظمة الإشعارات.
ومع ذلك، قد لا يكون MongoDB هو الخيار الأول الأفضل لكل مشكلة. يمكن تقديم خدمة أفضل للأنظمة ذات البيانات الارتباطية العالية، أو الروابط المعقدة، أو تقارير المعاملات الصارمة، أو تحليلات SQL الثقيلة من خلال database الارتباطية مثل MySQL أو PostgreSQL، أو باستخدام MongoDB مع أدوات أخرى.
كيف تعمل مفاهيم MongoDB معًا
المواضيع في هذه المقالة مترابطة. عليك أن تبدأ بفهم MongoDB's document model. ثم تقوم بإنشاء أو تحديد database. داخل database، تعمل مع collections. داخل collections، قمت بإدراج documents. بعد إدراج البيانات، يمكنك استخدام Query API للعثور على documents مع عوامل التصفية والإسقاطات والفرز والحدود. عندما تتغير البيانات، يمكنك تحديث documents باستخدام update operators. عندما لا تكون هناك حاجة للبيانات، يمكنك حذفها بعناية أو وضع علامة عليها كمحذوفة باستخدام الحذف الناعم.
عادةً ما يبدو سير العمل الاحترافي MongoDB كما يلي:
فهم بيانات التطبيق وأنماط الوصول.
اختر أسماء database وcollection.
تصميم هيكل document باستخدام التضمين والمراجع بحكمة.
قم بإنشاء قواعد collections وvalidation وindexes عند الحاجة.
أدخل documents مع أنواع البيانات الصحيحة.
اقرأ documents باستخدام عوامل التصفية والإسقاطات والفرز وترقيم الصفحات.
قم بتحديث documents باستخدام update operators الآمن.
احذف documents بعناية أو استخدم الحذف الناعم للبيانات المهمة.
مراقبة أداء الاستعلام وتحسين indexes بناءً على الاستخدام الحقيقي.
قم بحماية بيانات الإنتاج من خلال المصادقة والنسخ الاحتياطية والأذونات المحدودة.
يحول سير العمل هذا MongoDB من متجر document البسيط إلى طبقة database الموثوقة للتطبيقات الحقيقية.
الاستنتاج
MongoDB هو document database قوي يسمح للمطورين بتخزين البيانات في شكل مرن يشبه JSON documents. من السهل البدء بمفاهيمها الأساسية: databases يحتوي على collections، وcollections يحتوي على documents، وdocuments يحتوي على حقول. ولكن لاستخدام MongoDB جيدًا، يجب على المطورين فهم نمذجة Query API، وdocument، وإدراج العمليات، والعثور على العمليات، وupdate operators، وحذف الأمان، وindexes، وvalidation، وبنية المشروع الحقيقية.
تشكل المواضيع التي تتناولها هذه المقالة أساس تطوير MongoDB: الصفحة الرئيسية MongoDB والبدء وQuery API وإنشاء قاعدة بيانات وجمع وإدراج وبحث وتحديث وحذف. بمجرد توضيح هذه المواضيع، فإن الخطوة التالية هي معرفة indexing وaggregation pipelines وschema validation والعلاقات والمعاملات وتحسين الأداء واستراتيجيات النسخ الاحتياطي والأمان.
لا يتعلق MongoDB فقط بتخزين البيانات المشابهة لـ JSON. يتعلق الأمر بتصميم documents حول سلوك التطبيق، وقراءة البيانات بكفاءة، وتحديثها بأمان، وبناء أنظمة يمكن أن تنمو دون أن تصبح فوضوية. عند استخدامه بانضباط، يمكن أن يكون MongoDB اختيارًا ممتازًا لـ database لتطبيقات backend الحديثة.

