
نشرح في هذه المقالة طريقة التعامل مع نظام إدارة قواعد البيانات MongoDB الذي يمتاز بكونه نظام غير علاقي وموجه نحو المستندات document-oriented، أي أنه يخزن البيانات في هيئة مستندات، ومثله مثل بقية أنظمة إدارة قواعد البيانات فهو يتعامل مع البيانات عبر أربع عمليات أساسية نسميها اختصارًا عمليات CRUD تشمل:
- عمليات الإنشاء Create أي كتابة بيانات جديدة لقاعدة البيانات
- عمليات القراءة Read وهي عمليات الاستعلام التي نحصل بواسطتها على البيانات المخزنة
- عمليات التحديث Update وتعني العمليات التي تسبب تغييرًا في البيانات الموجودة ضمن قاعدة البيانات
- عمليات الحذف Delete وهي العمليات التي تؤدي إلى إزالة البيانات نهائيًا من قاعدة البيانات
لنوضح من خلال الأمثلة العملية طريقة تنفيذ هذه كل من هذه العمليات على قاعدة بيانات من نوع MongoDB.
متطلبات العمل
لمتابعة سير العمل في هذا المقال يتوجب امتلاك معرفة أساسية بكيفية استخدام واجهة أوامر Mongodb المعروفة باسم Mongodb Shell وتنفيذ أوامر قاعدة البيانات.كما يجب توفّر خادم يعمل بنظام Ubuntu يحتوي على مستخدم عادي غير الجذر يمتلك صلاحيات sudo، مع تفعيل جدار الحماية الافتراضي UFW على الخادم، ويجب تثبيت MongoDB على الخادم، وتأمين قاعدة البيانات بإنشاء مستخدم إداري administrative user على قاعدة البيانات لديه صلاحية مسؤول وتفعيل المصادقة authentication في قاعدة البيانات لأنها تكون مُعطلة تلقائيًا. يمكن الاستعانة بمقال كيفية تثبيت وتأمين MongoDB على أوبونتو فهو يتضمن كل الخطوات اللازمة.
الاتصال بخادم MongoDB
قبل البدء بتنفيذ عمليات CRUD على البيانات، علينا الاتصال بقاعدة بيانات MongoDB عبر الصدفة MongoDB Shell. فإذا كان خادم MongoDB الذي نعمل عليه مبني على خادم بعيد وليس على جهازنا المحلي، نفتح جلسة SSH للاتصال به كما يلي:
$ ssh sammy@your_server_ip
ولمطالعة المزيد من المعلومات حول SSH ننصح بمشاهدة الفيديو التالي:
بعدها نتصل بتطبيق MongoDB المُثَبَّت على الخادم بواسطة مستخدم يتمتع بصلاحيات القراءة والكتابة على البيانات، وسيكون أمر الاتصال بالصيغة التالية:
$ mongo -u AdminSammy -p --authenticationDatabase admin
ستُطلب منا كلمة المرور لمستخدم قاعدة البيانات وبعد كتابتها ستفتح الصدفة Shell مباشرة، ويمكن التأكد من ذلك بتغيّر شكل الموجّه في النافذة الطرفية ليصبح على هذا الشكل <
عندها تكون الصدفة جاهزة لاستقبال الأوامر التي نريد توجيهها إلى الخادم
ملاحظة: بمجرد إنشاء اتصال جديد مع خادم MongoDB سيصلنا تلقائيًا بقاعدة البيانات الاختبارية لنظام MongoDB تدعى test
، ويمكن الانتقال إلى قاعدة بياناتنا الخاصة باستخدام الأمر use
متبوعًا باسم قاعدة البيانات كما في المثال التالي:
use database_name
والآن بعد أن جهزنا الاتصال بخادم MongoDB، يمكننا البدء بالعملية الأولى من عمليات CRUD وهي Create لإنشاء مستندات جديدة.
إنشاء المستندات
سننشئ مستندات MongoDB ونستخدامها لاحقًا في تطبيق الأمثلة على عمليات القراءة والتحديث والحذف. لنفترض أننا نريد إنشاء مستندات تخزن معلومات عامة عن بعض المعالم الأثرية مثل: اسم المعلم الأثري، والبلد الذي يوجد فيه، والمدينة، وإحداثيات الموقع الجغرافي.
ستكون المستندات التي تتضمن معلومات عن أهرامات الجيزة The Pyramids of Giza
مثلًا وفق الصيغة التالية:
{ "name": "The Pyramids of Giza", "city": "Giza", "country": "Egypt", "gps": { "lat": 29.976480, "lng": 31.131302 } }
تُكتب مستندات MongoDB وتعالج بصيغة BSON، وهي تمثيل ثنائي لملفات JSON سهل القراءة والفهم ويوفر بعض الإضافات التي تسمح بتخزين أنواع بيانات إضافية لا تدعمها صيغة JSON. تُمثَّل البيانات الموجودة في هذه المستندات بهيئة أزواج حقل وقيمة field: value
.
يتضمن المستند الذي أنشأناه أربعة حقول يشير الحقل الأول إلى اسم المعلم الأثري، يليه المدينة في الحقل الثاني، والبلد في الحقل الثالث، وتحتوي هذه الحقول الثلاثة على سلاسل نصية strings، أما الحقل الأخير والمسمى gps
، فهو مستند متداخل nested document أي مستند داخل مستند يعرض معلومات عن الموقع الجغرافي للمكان الأثري ويتضمن إحداثيات خطوط الطول والعرض يمثلها الحقلان lat
و lng
والقيم ضمنهما من نوع عدد عشري.
تنتمي المستندات في MongoDB دائمًا إلى مجموعات collections، وهي تكافئ الجداول tables في قواعد البيانات العلاقية مثل MySQL أما المستندات في MongoDB فهي تشبه الصفوف rows ضمن كل جدول
وبناءً على ذلك سننشئ المستند الذي كتبنا صيغته في المثال السابق ضمن مجموعة باسم monuments
باستخدام الأمر insertOne
الذي ينشئ مستندًا واحدًا فقط، وهناك أمر آخر يسمح لنا بإنشاء عدة مستندات بنفس الوقت.
لنكتب إذًا أمر الإنشاء التالي في نافذة الصدفة:
> db.monuments.insertOne( > { > "name": "The Pyramids of Giza", > "city": "Giza", > "country": "Egypt", > "gps": { > "lat": 29.976480, > "lng": 31.131302 > } > } > )
نلاحظ هنا أننا لم ننشئ المجموعة monuments
مُسبقًا قبل إدراج المستندات ضمنها، فنظام MongoDB مرن من هذه الناحية فالمجموعة ستنشأ تلقائيًا مع إدراج أول مستند فيها، وبذلك فإن التابع insertOne()
لم يُنشئ المستند فحسب بل أنشأ المجموعة أيضًا.
سنحصل على الخرج التالي الذي يعلمنا بنجاح تنفيذ التابع insertOne()
وإنشاء المستند المطلوب، بالإضافة إلى إرجاع مُعَرّف الكائن ObjectId
الخاص به والذي ينشأ تلقائيًا لكل كائن أو مستند جديد:
{ "acknowledged" : true, "insertedId" : ObjectId("6105752352e6d1ebb7072647") }
ينبغي أن يتضمن كل مستند في مجموعة MongoDB حقلًا خاصًا بالمُعَرِّف الفريد id_
للمستند والذي كمفتاح رئيسي primary key، يمكنك إعطاء الحقل id_
أي قيمة نختارها طالما أننا ملتزمون تمامًا بالحفاظ على قيمة فريدة له وعدم تكراره بين المستندات، وبكل الأحوال إذا أهملنا هذا الحقل عند إنشاء أي مستند جديد فإن MongoDB ستُنشئه نيابةً عنا ويكون بهيئة كائن ObjectId
كما شاهدنا في الخرج السابق.
للتأكد من صحة الإنشاء، يمكن تفقد عدد المستندات في المجموعة monuments
باستخدام الأمر التالي:
> db.monuments.count()
سيُرجع التابع count
القيمة 1
لأننا أدخلنا مستندًا واحدًا فقط في المجموعة:
1
توفر MongoDB طريقةً سهلة لإدخال عدة مستندات إلى المجموعة بعملية واحدة عبر التابع insertMany
فالإدخال الفردي قد يصبح مرهقًا إذا كانت المستندات معقدة وكثيرة العدد. على سبيل المثال ينشئ الأمر التالي ستة مستندات دفعة واحدة ضمن المجموعة monuments
:
> db.monuments.insertMany([ > {"name": "The Valley of the Kings", "city": "Luxor", "country": "Egypt", "gps": { "lat": 25.746424, "lng": 32.605309 }}, > {"name": "Arc de Triomphe", "city": "Paris", "country": "France", "gps": { "lat": 48.873756, "lng": 2.294946 }}, > {"name": "The Eiffel Tower", "city": "Paris", "country": "France", "gps": { "lat": 48.858093, "lng": 2.294694 }}, > {"name": "Acropolis", "city": "Athens", "country": "Greece", "gps": { "lat": 37.970833, "lng": 23.726110 }}, > {"name": "The Great Wall of China", "city": "Huairou", "country": "China", "gps": { "lat": 40.431908, "lng": 116.570374 }}, > {"name": "The Statue of Liberty", "city": "New York", "country": "USA", "gps": { "lat": 40.689247, "lng": -74.044502 }} > ])
تُحيط الأقواس المربعة [
]
بالمستندات الستة في المثال أعلاه، فهي تشكل مصفوفة من العناصر، ويفصل بين كل عنصر وآخر فاصلة ,
فعندما نريد تمرير عدة كائنات في MongoDB أيًّا كان نوعها نمررها بشكل مصفوفة بين قوسين مربعين.
بمجرد تنفيذ أمر الإنشاء السابق سيظهر الخرج التالي ليعلمنا بنجاح العملية ويرجع المعرّفات الفريدة لكل مستند:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("6105770952e6d1ebb7072648"), ObjectId("6105770952e6d1ebb7072649"), ObjectId("6105770952e6d1ebb707264a"), ObjectId("6105770952e6d1ebb707264b"), ObjectId("6105770952e6d1ebb707264c"), ObjectId("6105770952e6d1ebb707264d") ] }
لنتأكد من صحة أمر إنشاء المستندات الجديدة بالاستعلام عن عدد المستندات في المجموعة monuments
:
> db.monuments.count()
سنحصل على الخرج التالي الذي يوضح أن عدد المستندات في المجموعة أصبح 7
بعد إضافة ستة مستندات جديدة إلى المستند الأول:
7
بعد أن أنشانا المستندات، لننتقل للخطوة التالية التي تشرح كيفية قراءة هذه البيانات من هذه المستندات.
قراءة المستندات
أصبح لدينا مجموعة تتضمن سبعة مستندات، ويمكننا الاستعلام عنها من قاعدة البيانات، سنعرض في البداية طريقة الاستعلام عن جميع مستندات المجموعة من دون استثناء، ثم سنتعلم تضييق نطاق الاستعلام لنحصل على مجموعة أقل من المستندات.
لنبدأ بقراءة المستندات السبعة من المجموعة monuments
بعملية واحد باستخدام التابع ()find
:
> db.monuments.find()
يؤدي استخدام التابع ()find
بدون وسطاء إلى إرجاع جميع البيانات الموجودة في المجموعة المحددة وهي في حالتنا المجموعة monuments
وسنحصل بالتالي على هذا الخرج:
{ "_id" : ObjectId("6105752352e6d1ebb7072647"), "name" : "The Pyramids of Giza", "city" : "Giza", "country" : "Egypt", "gps" : { "lat" : 29.97648, "lng" : 31.131302 } } { "_id" : ObjectId("6105770952e6d1ebb7072648"), "name" : "The Valley of the Kings", "city" : "Luxor", "country" : "Egypt", "gps" : { "lat" : 25.746424, "lng" : 32.605309 } } { "_id" : ObjectId("6105770952e6d1ebb7072649"), "name" : "Arc de Triomphe", "city" : "Paris", "country" : "France", "gps" : { "lat" : 48.873756, "lng" : 2.294946 } } { "_id" : ObjectId("6105770952e6d1ebb707264a"), "name" : "The Eiffel Tower", "city" : "Paris", "country" : "France", "gps" : { "lat" : 48.858093, "lng" : 2.294694 } } { "_id" : ObjectId("6105770952e6d1ebb707264b"), "name" : "Acropolis", "city" : "Athens", "country" : "Greece", "gps" : { "lat" : 37.970833, "lng" : 23.72611 } } { "_id" : ObjectId("6105770952e6d1ebb707264c"), "name" : "The Great Wall of China", "city" : "Huairou", "country" : "China", "gps" : { "lat" : 40.431908, "lng" : 116.570374 } } { "_id" : ObjectId("6105770952e6d1ebb707264d"), "name" : "The Statue of Liberty", "city" : "New York", "country" : "USA", "gps" : { "lat" : 40.689247, "lng" : -74.044502 } }
تعرض الصدفة MongoDB Shell المستندات السبعة بكامل حقولها، ونلاحظ أن لكل حقل مُعَرّف خاص id_
رغم أننا لم نُعَرِّفه عند إنشاء المستندات، وذلك لأن MongoDB كما ذكرنا تُنشئ المُعرفات تلقائيًا مع أوامر الإدخال وهي تعمل كمفاتيح رئيسية للمستندات الخاصة بها.
نلاحظ أيضًا أن طريقة عرض البيانات ضمن الصدفة MongoDB Shell صعب القراءة نوعًا ما، وخاصة إذا كانت المستندات كثيرة الحقول أو تتضمن مستندات متداخلة فالمستند الواحد سيظهر بجميع بياناته بسطر واحد، ويمكن تحسين الإظهار وجعله أسهل في القراءة باستخدام الخاصية ()pretty
مع التابع ()find
كما يلي:
> db.monuments.find().pretty()
الآن ستعرض الصدفة MongoDB Shell الخرج بالطريقة التالية، حيث تفرد لكل مستند عدة أسطر يبدأ كل منها بمسافة بادئة indentation:
{ "_id" : ObjectId("6105752352e6d1ebb7072647"), "name" : "The Pyramids of Giza", "city" : "Giza", "country" : "Egypt", "gps" : { "lat" : 29.97648, "lng" : 31.131302 } } { "_id" : ObjectId("6105770952e6d1ebb7072648"), "name" : "The Valley of the Kings", "city" : "Luxor", "country" : "Egypt", "gps" : { "lat" : 25.746424, "lng" : 32.605309 } } . . .
لنستخدم بعض الوسطاء مع التابع ()find
لتضييق نتائج البحث فمثالنا السابق أرجع كافة مستندات المجموعة من دون أي تصفية.
ذكرنا سابقًا أن MongoDB تعطي مُعَرِّفًا فريدًا لكل مستند، لنأخذ مثلًا المستند المُسمى "The Valley of the Kings" والذي يشير لأحد المعالم الأثرية في مجموعتنا وله المُعرِّف ObjectId("6105770952e6d1ebb7072648")
الذي يميزه عن غيره، علمًا أن مُعرِّف الكائن ObjectId
ليس من مجرد سلسلة ست عشرية فهو بحد ذاته كائن أيضًا وهو نوع خاص من البيانات تستخدمه MonogoDB لتخزين مُعَرِّفات الكائنات، ويمكن مطالعة المزيد عن أنواع البيانات التي تتعامل معها MongoDB.
سُنمَرِّر الآن هذا المُعَرِّف كوسيط للتابع ()find
بهيئة مستند يسمى مستند تصفية الاستعلام query filter document، تتمتع مستندات تصفية الاستعلام بنفس بنية مستندات مجموعة البيانات أي بنية حقل وقيمة لكنها تستخدم لغرض خاص هو تصفية نتائج الاستعلام.
يتضمن مستند تصفية الاستعلام في حالتنا الحقل id_
والقيمة التي تمثل Objectid
للمستند "The Valley of the Kings"، وسيأخذ الاستعلام عندها الصيغة التالية:
> db.monuments.find({"_id": ObjectId("6105770952e6d1ebb7072648")}).pretty()
يستخدم مستند تصفية الاستعلام في هذا المثال شرط المساواة لإرجاع النتائج، فستُرجع ()find
المستند الذي يطابق معرفه id_
القيمة ObjectId("6105770952e6d1ebb7072648")
فقط ولن تُرجع معه أي مستند آخر.
سنحصل في هذه الحالة على الخرج التالي:
{ "_id" : ObjectId("6105770952e6d1ebb7072648"), "name" : "The Valley of the Kings", "city" : "Luxor", "country" : "Egypt", "gps" : { "lat" : 25.746424, "lng" : 32.605309 } }
لنجرب مثالًا آخر، سنستعلم هنا عن جميع المعالم الأثرية الموجودة في فرنسا أي التي تحقق الشرط التالي:
> db.monuments.find({"country": "France"}).pretty()
سيُرجع هذا الاستعلام نتيجتين كما يلي:
{ "_id" : ObjectId("6105770952e6d1ebb7072649"), "name" : "Arc de Triomphe", "city" : "Paris", "country" : "France", "gps" : { "lat" : 48.873756, "lng" : 2.294946 } } { "_id" : ObjectId("6105770952e6d1ebb707264a"), "name" : "The Eiffel Tower", "city" : "Paris", "country" : "France", "gps" : { "lat" : 48.858093, "lng" : 2.294694 } }
الخطوة 4: تحديث المستندات
يُقصد بتحديث المستندات Updating Documents في قواعد بيانات MongoDB إما تغيير بنية المستند نفسه بإضافة أو تعديل الحقول لتناسب متطلبات جديدة في التطبيق مثلًا، أو تعديل قيم البيانات المُخَزَّنة ضمن المستند، سنناقش أمثلةًعن كلا الحالتين إذ سنُعَدِّل بعض القيم في المستندات وسنضيف حقلًا جديدًا إلى مستندات المجموعة.
توفر MongoDB طريقتين لتحديث المستندات إما فرديًا أو جماعيًا، في التحديث الجماعي للمستندات يتعين علينا تمرير القيم التي نريد تحديثها كوسيط لتابع التحديث، وفي التحديث الفردي نمرر مُعَرِّف المستند الذي نود تعديله إضافةً إلى القيم الجديدة.
تستخدم MongoDB آلية مستند تصفية الاستعلام query filter document نفسها التي استخدمناها في الفقرة السابقة، وذلك للسماح للمستخدم بتحديد المستندات التي يود تحديثها.
يبين المثال التالي طريقة تغيير اسم أحد المعالم الأثرية وليكن مثلًا قوس النصر Arc de Triomphe
حيث سنغير اسمه إلى Arc de Triomphe de l’Étoile
، باستخدام التابع ()updateOne
المخصص لتحديث مستند واحد فقط في كل عملية:
> db.monuments.updateOne( > { "name": "Arc de Triomphe" }, > { > $set: { "name": "Arc de Triomphe de l'Étoile" } > } > )
سيكون اسم المستند الذي نرغب بتعديله هو الوسيط الأول للتابع ()updateOne
وهو في حالتنا { "name": "Arc de Triomphe" }
وهو مستند تصفية استعلام مع شرط المساواة، وبالتالي سيُرجع لنا المستند الذي يطابق اسمه تمامًا القيمة المذكورة، وسيكون هو المستند الذي ننفذ عليه التعديل.
أما الوسيط الثاني فهو مستند التحديث update document الذي يتضمن التحديثات التي ينبغي أن تُطَبَّق عند تنفيذ التابع، يتكون مستند التحديث من عوامل تحديث operators تلعب دور المفاتيح keys، ومعاملات parameters مقابلة تمثل القيم الجديدة values. في حالتنا عامل التحديث هو set$
وهو المسؤول عن إعطاء قيم جديدة لحقول المستند التي تُكتب بصيغة كائنات JSON مثل { "name": "Arc de Triomphe de l'Étoile" }
الذي يعني ضمنًا تعديل قيمة الحقل name
لتصبح Arc de Triomphe de l'Étoile
.
يُرجع تابع التحديث ()updateOne
خرجًا يخبرنا بنتيجة عمله، فقد عثر على مستند واحد مطابق للشروط، وحَدَّث قيمته بنجاح، كما يلي:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
تنويه: قد لا يكون مستند تصفية الاستعلام المستخدم كوسيط أول للتابع ()updateOne
مُحَددًا ودقيقًا بما يكفي لإعطائنا نتيجة واحدة فيُرجِع عدة مستندات تتوافق مع شروط الاستعلام بدلًا من واحد، في هذه الحالة سيأخذ التابع ()updateOne
أول مستند من هذه المستندات ويطَبِّق التعديلات عليه ويهمل البقية لأنه في نهاية الأمر مُخصص للعمل مع مستند واحد.
لنتأكد الآن من نجاح عملية التحديث، سنطلب جميع المعالم الأثرية الموجودة في فرنسا France
وفق الآتي:
> db.monuments.find({"country": "France"}).pretty()
يؤكد لنا الخرج التالي تغيير طريقة كتابة Arc de Triomphe
وبالتالي نجاح عملية التحديث:
{ "_id" : ObjectId("6105770952e6d1ebb7072649"), "name" : "Arc de Triomphe de l'Étoile", "city" : "Paris", "country" : "France", "gps" : { "lat" : 48.873756, "lng" : 2.294946 } } . . .
سنستعمل الآن التابع ()updateMany
لتعديل أكثر من مستند في نفس الوقت.
لنفترض مثلًا أننا نريد إضافة حقل إلى كل مستند من مستندات المجموعة، يبين هذا الحقل اسم المُحرِّر editor
الذي أدخل بيانات المعلم الأثري. طالما أننا سنُنَفِّذ التعديل على جميع المستندات في المجموعة، فسنستخدم إذًا مستند تصفية استعلام فارغ بلا أي شروط وبسببه سيؤثر ()updateMany
على جميع مستندات المجموعة monuments
ويُضيف إلى كل واحد منها حقلًا جديدًا يدعى editor
ويحمل القيمة Sammy
وفق التالي:
> db.monuments.updateMany( > { }, > { > $set: { "editor": "Sammy" } > } > )
سيعطي هذا التابع الخرج التالي الذي يعلمنا بنتيجة التنفيذ:
{ "acknowledged" : true, "matchedCount" : 7, "modifiedCount" : 7 }
عثرنا على سبعة مستندات مطابقة للشروط، وعَدَّلنا المستندات السبعة بنجاح.
يمكن التأكد من إضافة الحقل الجديد إلى مستندات المجموعة بواسطة الأمر التالي:
> db.monuments.find().pretty()
وسيكون الخرج كما يلي:
{ "_id" : ObjectId("6105752352e6d1ebb7072647"), "name" : "The Pyramids of Giza", "city" : "Giza", "country" : "Egypt", "gps" : { "lat" : 29.97648, "lng" : 31.131302 }, "editor" : "Sammy" } { "_id" : ObjectId("6105770952e6d1ebb7072648"), "name" : "The Valley of the Kings", "city" : "Luxor", "country" : "Egypt", "gps" : { "lat" : 25.746424, "lng" : 32.605309 }, "editor" : "Sammy" } . . .
كما نلاحظ فقد أُضيف حقل جديد إلى كل مستندات المجموعة، فإعطاء اسم حقل غير موجود للعامل set$
في تابع التحديث يعني أننا نطلب منه إنشاء هذا الحقل ومنحه القيمة المحددة.
يُعدّ set$
عاملًا شائع الاستخدام وسيفيدنا في كثير من الحالات، مع ذلك توفر MongoDB قائمة طويلة من عوامل التعديل التي تساعدنا على إجراء تحديثات متنوعة ومعقدة على المستندات ويمكن معرفة المزيد عنها من توثيقات MongoDB الرسمية.
حذف المستندات
إذا احتجنا لحذف بعض البيانات القديمة من قاعدة بيانات MongoDB فيمكن استخدام تابعين للحذف الأول هو التابع ()deleteOne
لحذف مستند واحد من المستندات المطابقة لشروط مستند تصفية الاستعلام، والثاني هو التابع ()deleteMany
لحذف عدة مستندات دفعة واحدة.
لنحاول حذف المستند الخاص بقوس النصر Arc de Triomphe de l’Étoile
الذي عَدَّلنا اسمه قبل قليل، وذلك وفق الأمر التالي:
> db.monuments.deleteOne( > { "name": "Arc de Triomphe de l'Étoile" } > )
نلاحظ أن مستند تصفية الاستعلام المستخدم هنا مشابه لما استخدمناه في الأمثلة السابقة عند القراءة والتحديث، ويمكن بالتأكيد استخدام أي استعلام مكتوب بطريقة صحية لتحديد المستند الذي نريد حذفه.
نحصل بعد التنفيذ على خرج يشبه التالي:
{ "acknowledged" : true, "deletedCount" : 1 }
يبين هذا الخرج عدد المستندات المحذوفة بموجب الأمر السابق.
والآن لنتأكد من حذف المستند بالاستعلام عن الآثار الموجودة في فرنسا وفق التالي:
> db.monuments.find({"country": "France"}).pretty()
ستتضمن نتيجة الاستعلام المستند الخاص ببرج إيفل The Eiffel Tower
فقط لأننا حذفنا مستند قوس النصر Arc de Triomphe de l’Étoile
:
{ "_id" : ObjectId("6105770952e6d1ebb707264a"), "name" : "The Eiffel Tower", "city" : "Paris", "country" : "France", "gps" : { "lat" : 48.858093, "lng" : 2.294694 }, "editor" : "Sammy" }
لنشرح الآن طريقة حذف مستندات متعددة، ولنحذف مثلًا كافة المستندات التي أنشأها المحرر الذي اسمه Sammy
، طبعًا سيؤدي هذا إلى حذف جميع مستندات المجموعة لأن Sammy
هو المحرر الذي أضفناه لكافة مستندات المجموعة monuments
:
> db.monuments.deleteMany( > { "editor": "Sammy" } > )
سيعلمنا الخرج بحذف ستة مستندات:
{ "acknowledged" : true, "deletedCount" : 6 }
ويمكن التأكد من النتيجة بالاستعلام عن عدد مستندات المجموعة monuments
كما يلي:
> db.monuments.count()
سنحصل على الخرج التالي:
0
تعني النتيجة 0
حذف جميع المستندات في المجموعة.
الخاتمة
تعرفنا في هذا المقال على طريقة تطبيق عمليات CRUD على قاعدة بيانات MongoDB، إذ تُعَدّ هذه العمليات أساسية في إدارة البيانات ويمكن من خلالها إنشاء مستندات جديدة وتعديلها والاستعلام عنها وحذفها عند الضرورة.
وننوه في الختام أننا عرضنا في هذا المقال طريقةً واحدة فقط من طرق تصفية الاستعلام، لكن MongoDB توفر طرقًا أخرى أقوى وأكثر تعقيدًا ويمكنكم تعلم المزيد عنها بمراجعة قسم MongoDB على أكاديمية حسوب وتوثيقات MongoDB الرسمية.
ترجمة -وبتصرف- لمقال How To Perform CRUD Operations in MongoDB لصاحبه Mateusz Papiernik.
#3qpa7meed #ArabProgrammers #المبرمجون_العرب #arab_programmers #عقبة_البرق
تعليقات
إرسال تعليق