فتح ندوات عبر الإنترنت "أساسيات MongoDB"

أيها الأصدقاء ، سيتم إطلاق الإصدار التالي من دورة قواعد البيانات غدًا ، لذا فقد عقدنا درسًا مفتوحًا تقليديًا ، يمكنك تسجيله هنا . تحدثنا هذه المرة عن قاعدة بيانات MongoDB الشائعة: درسنا بعض التفاصيل الدقيقة ، وفحصنا أساسيات العمل والميزات والهندسة المعمارية. وتطرق أيضا بعض حالات المستخدم.



تم إجراء الندوة عبر الإنترنت بواسطة إيفان ريمين ، رئيس قسم تطوير الخوادم في Citimobil.


ميزات MongoDB


MongoDB هو نظام لإدارة قواعد البيانات مفتوح المصدر وموجّه نحو المستندات ولا يحتاج إلى وصف لمخطط الجدول. تصنف على أنها NoSQL وتستخدم BSON (ثنائي JSON). تحجيم خارج المربع ، مكتوب في C ++ ويدعم بناء جملة JavaScript. لا يوجد دعم SQL.

لدى MongoDB برامج تشغيل للعديد من لغات البرمجة الشائعة (C ، C ++ ، C # ، Go ، Java ، JavaScript ، Perl ، PHP ، Python ، Ruby ، ​​إلخ). هناك أيضًا برامج تشغيل غير رسمية يدعمها المجتمع للغات البرمجة الأخرى.

حسنًا ، دعنا ننظر إلى الأوامر الأساسية التي قد تكون مفيدة.

لذلك ، لنشر MongoDB في Docker ، نكتب:

docker run -it --rm -p 127.0.0.1:27017:27017 --name mongo-exp-project mongo docker exec -it mongo-exp-project mongo 

وبالتالي ، يبدأ عميل MongoDB:



الآن دعنا نكتب Hello World التقليدية:

 print (“Hello world!”) 



بعد ذلك ، قم بتشغيل الحلقة :



كما لاحظت ، لدينا JS منتظم أمامنا ، و MongoDB هو مترجم جافا سكريبت كامل .

متى يجب استخدام MongoDB؟


هناك قصة مفادها أن متوسط ​​بدء التشغيل في وادي السيليكون هو الرجل الذي افتتح كتاب "HTML for Dummies" قبل أسبوع. أي مكدس سيختار؟ توافق على أنه مناسب جدًا له عندما يكون لديه JavaScript في متصفحه لأسباب واضحة ، Node.js يدور على الخادم ، وجافا سكريبت أيضًا في قاعدة البيانات. هذا هو النقطة رقم 1.

ثانياً ، هناك عرض ممتاز قدمه بيتر زايتسيف ، أحد أفضل خبراء قواعد البيانات في روسيا. في ذلك ، يتحدث بيتر عن MySQL و MongoDB ، مع التركيز على متى وما هو الأفضل للاستخدام.

ثالثًا ، أود التأكيد على أن MongoDB يتميز بقابلية جيدة للتطوير - وهذه واحدة من السمات الرئيسية لقاعدة البيانات. إذا كنت لا تعرف مسبقًا حجم التحميل ، فسيكون MongoDB مثاليًا. بالإضافة إلى ذلك ، فهو يدعم أنماطًا خارج الصندوق مثل التقاسم والتكرار ، وكل هذا يتسم بالشفافية تمامًا ، أي أنه مناسب جدًا للعمل.

بالنسبة للمصطلحات في MongoDB ، إذن:

  • القواعد هي قواعد (مخططات ، مجموع الجداول) ؛
  • في MongoDB يوجد شيء اسمه مجموعة - إنه تمثيلي لجدول ومجموعة من المستندات التي يجب أن تكون متصلاً وفقًا لمنطق الأشياء ؛
  • المستندات هي تمثيلية لخط.

إنشاء قاعدة البيانات والاستعلامات البسيطة


لإنشاء قاعدة بيانات ، ما عليك سوى البدء في استخدامه:

 use learn 



الآن قم بإدخال جزء صغير من المستند. فليكن ، على سبيل المثال ، وحيد القرن اسمه أورورا:

 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) 

ديسيبل هو كائن عالمي للوصول إلى قاعدة البيانات ، وهذا هو ، في الواقع ، "monga" نفسها. بالنسبة للتقاسم ، يتم استخدام sh ؛ للنسخ المتماثل ، يتم استخدام rs .

ما الأوامر التي يحتوي عليها كائن db :



لذا ، عد إلى فريقنا ، ونتيجة لذلك سوف تبلغ وحدة التحكم عن إدراج صف واحد:



الكلمة unicorns في db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) تعيّن مجموعة. يرجى ملاحظة أننا لم نصف المجموعة أو ننشئها ، لكننا ببساطة كتبنا "حيدات" وأدخلنا مجموعة ، وحصلنا على مجموعة.

وبالتالي يمكننا الحصول على جميع مجموعاتنا :

 db.getCollectionNames() 

حسنا وهلم جرا. يمكننا إدراج مجموعة أخرى :



الآن سنطلب مجموعة كاملة (نذكر أنه في حالتنا تحتوي قاعدة البيانات بالفعل على معلومات حول اثنين من حيدات يحمل نفس الاسم):

 db.unicorns.find() 

يرجى ملاحظة ، هنا هو JSON لدينا (هناك اسم ، الجنس ، الوزن ، بعض المعرف الفريد للكائن):



الآن دعنا ندخل زوجًا من حيدات أخرى تحمل نفس الاسم:

 db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) 

ودعونا نرى ما حدث:



كما ترون ، لدينا حقول إضافية: المنزل والدودة ، والتي لا تملكها أورورا.

إضافة عدد قليل من حيدات:

 db.unicorns.insertMany([{name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63}, {name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}, {name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}, {name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], weight: 575, gender: 'm', vampires: 99}]) 

لذلك ، قمنا بإدراج أربعة كائنات أخرى باستخدام JavaScript:



في أي قواعد بيانات تعتقد أنها أكثر ملاءمة لتخزين بيانات جواز السفر: في قواعد البيانات العلائقية أو في المونج؟

الجواب واضح - في mong ، والمثال أعلاه يوضح ذلك بشكل جيد. ليس سرا أن KLADR هو ألم في الاتحاد الروسي. يقع المنجا جيدًا على العناوين ، لأنه يمكنك تحديد كل شيء كصفيف ، وسيكون العيش فيه أسهل كثيرًا. وهذه حالة مستخدم جيدة لـ MongoDB .

إضافة المزيد من حيدات:

 db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); db.unicorns.insert({name:'Ayna', dob: new Date(1998, 2, 7, 8, 30), loves: ['strawberry', 'lemon'], weight: 733, gender: 'f', vampires: 40}); db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], weight: 421, gender: 'm', vampires: 2}); db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165}); 



الآن الانتباه إلى الوثائق. كما dob ، نحن تخزين الأشياء كلها. وهناك أيضًا معلومات يحبها يونيكورن ، وليس لدى الجميع هذه البيانات. وهكذا ، الداخل هو مجموعة كاملة .

بالمناسبة ، للحصول على إخراج أكثر جمالا ، يمكنك استدعاء الأسلوب .pretty() في نهاية أمر البحث:



إذا كنت بحاجة إلى الحصول على معلومات حول الخطأ الأخير ، استخدم الأمر التالي:

 db.getLastError() 

يمكن القيام بذلك بعد كل إدخال ، أو يمكنك تكوين Write Concern. من الأفضل أن تقرأ عنها في الوثائق الرسمية ، والتي ، بالمناسبة ، مفيدة للغاية في مونغ. بالمناسبة ، هناك أيضا مقال جيد عن حبري حول هذا الموضوع.

الانتقال إلى استفسارات أكثر تعقيدًا


طلب قيمة الحقل بالضبط:

 db.unicorns.find({gender: 'm'}) 

عن طريق كتابة مثل هذا الطلب ، نحصل في الإخراج على وحدة التحكم على قائمة بجميع حيدات الذكور.

يمكنك أيضًا تشغيل الاستعلام على الفور في عدة مجالات : حسب الجنس والوزن:



أعلاه ، انتبه إلى محدد gt $ الخاص ، والذي يسمح لك بعرض جميع حيدات الذكور التي يزيد وزنها عن 700.

يمكنك التحقق من وجود الحقل على الإطلاق :

 db.unicorns.find({vampires: {$exists: false}}) 

أو هكذا:

 db.unicorns.find({'parents.father': {$exists: true}}) 

يعرض الأمر التالي حيدات تبدأ أسماؤها بالحروف A أو a:

 db.unicorns.find({name: {$regex: "^[Aa]"}}) 

الآن دعونا ننظر إلى مجموعة البحث . السؤال رقم 1: ماذا سيخرج هذا الأمر:

 db.unicorns.find({loves:'apple'}) 

هذا صحيح: كل شخص يحب التفاح.

سيُرجع الأمر التالي فقط بيانات وحيد القرن التي تحتوي على التفاح والبطيخ فقط:

 db.unicorns.find({loves:[ "apple", "watermelon" ]}) 

وأمر واحد آخر:

 db.unicorns.find({loves:[ "watermelon", "apple" ]}) 

في حالتنا ، لن يُرجع أي شيء ، لأنه عندما نعبر صفيفًا ، تتم مقارنة العنصر الأول بالعنصر الثاني والعنصر الثاني ، إلخ. أي ، يجب أن يتزامن الصفيف أيضًا في مواضع هذه القيم.

وفيما يلي شكل بحث الصفيف باستخدام عامل التشغيل OR :



يوضح المثال التالي بحثًا باستخدام عامل التشغيل all all . وهنا التسلسل غير مبدئي بالفعل:



يمكننا أيضًا البحث حسب حجم المصفوفة:



لكن ماذا لو أردنا إيجاد مجموعة أكبر من واحدة؟ يوجد عامل حيث يمكنك من خلاله كتابة أشياء أكثر تعقيدًا:

 db.unicorns.find({$where: function() { return this.loves && (this.loves.length > 1) } }) 

بالمناسبة ، إذا كنت تريد التدريب ، إليك ملف به أوامر.

ميزات المؤشر


دعونا نحفر قليلاً ونقول بضع كلمات حول ميزات monga:

  • find () والعمليات الأخرى لا تُرجع البيانات - تُرجع ما يسمى "المؤشر" ؛
  • ما نراه عند طباعة البيانات هو عمل المترجم الفوري.

بكتابة db.unicorns.find دون أقواس ، نحصل على تلميح:



نواصل تلبية الطلبات


يوجد أيضًا $ في المشغل:

 db.unicorns.find({weight: {$in: [650, 704]}}) 



الآن دعنا نتحدث عن التحديث . على سبيل المثال ، دعنا نغير وزن Roooooodles وحيد القرن:

 db.unicorns.update({name: "Roooooodles"}, {weight: 2222}) 

نتيجة لإجراءاتنا ، سيتم تحديث المستند بالكامل ، وسيبقى فيه حقل واحد محدد فقط:



وهذا هو ، الشيء الوحيد الذي لا يزال مع وجوهنا هو وزن 2222 ، وبطبيعة الحال ، معرف.

يمكنك إصلاح هذا باستخدام $ set :

 db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}}) 




من الممكن أيضًا زيادة القيم :



هناك أيضا upert - مزيج من التحديث وإدراج:



وإليك كيفية تحديد الحقول :





يبقى لإضافة بضع كلمات حول التخطي والحد :



الزملاء ، هذا كل شيء ، إذا كنت تريد معرفة التفاصيل ، شاهد الفيديو بأكمله . ولا تنسى أن تترك تعليقاتك!

Source: https://habr.com/ru/post/ar474054/


All Articles