في الدرس السابق،
تعلمنا عن برنامج تشغيل MongoDB.
هذا يمكّن تطبيق العقدة لدينا من التواصل مع خادم MongoDB،
وكذلك تخزين المستندات واستردادها من خادم MongoDB.
رأينا أيضًا أن برنامج تشغيل MongoDB يوفر لنا
العديد من الطرق التي تمكننا من إنشاء مجموعات داخل قاعدة بيانات،
وإضافة مستندات إلى المجموعات،
ثم إجراء عمليات مختلفة على المستندات داخل مجموعة.
الآن، عندما يتم تخزين المستندات في قاعدة البيانات،
لا يفرض برنامج تشغيل MongoDB نفسه أي بنية على المستندات.
إذا كنا بحاجة إلى بنية محددة للمستندات وفرض هذا الهيكل،
فإننا بحاجة إلى الاستفادة من وحدة عقدة Mongoose التي تمكننا من تحديد
مخطط وبنية لمستنداتنا المخزنة في قاعدة بيانات MongoDB الخاصة بنا،
وفرض الهيكل بشكل صارم.
دعونا ننظر إلى مزيد من التفاصيل في هذه المحاضرة والتدريبات التي تتبع هذه المحاضرة.
كما تعلمنا بالفعل، يقوم
MongoDB بتخزين البيانات في مجموعات في قاعدة بيانات.
تتكون هذه المجموعات من مجموعة من الوثائق.
الوثائق نفسها المخزنة في
قاعدة بيانات MongoDB ليس لها بنية محددة مفروضة على الوثيقة.
يمكن تخزين أي مستند في أي مجموعة.
يعتمد MongoDB على المطور لفرض البنية على المستندات،
ويعطي المسؤولية الكاملة للمطور للتأكد
من إضافة مستندات البنية الصحيحة والحفاظ عليها في المجموعات المختلفة.
الآن، من السهل جدا انتهاك هذا.
على سبيل المثال، على الرغم من أنك قد تبدأ بافتراض
أن اتصالاً معينًا سيكون له مستندات ذات بنية معينة،
يمكنك بسهولة إدراج مستندات لا تتوافق بالضرورة مع البنية.
إذا كنت محددًا جدًا أن بنية المستندات في
المجموعة تحتوي دائمًا على بنية محددة،
وستحصل دائمًا على مجموعة محددة من الحقول،
فإن MongoDB نفسه لا يفرض ذلك أيضًا
برنامج تشغيل MongoDB الذي رأيناه في الدرس السابق.
هذا هو المكان الذي سنحتاج فيه إلى طريقة أكثر رسمية لفرض
بنية على المستندات المخزنة في مجموعة في قاعدة بيانات MongoDB.
هذا هو المكان الذي تأتي وحدة عقدة النمس لمساعدتنا.
تفرض الوحدة النمطية عقدة Mongoose
بنية موحدة للمستندات المخزنة في مجموعة معينة.
لذلك، هذا هو السبب في أننا غالبا ما نسمع الناس يشيرون إلى هذا باسم Mongoose ODM.
يتم تفسير ODM نفسه من قبل بعض الأشخاص على أنه يعني
نموذج بيانات الكائن أو يشار إليه أحيانًا باسم تعيين مستند الكائن،
أو يشير بعض الأشخاص إليه على أنه ORM أو تعيين كائن علائقي.
الآن، عندما نتحدث عن العلائقية التي تنطبق أكثر بكثير على قواعد البيانات العلائقية،
ولكن بعد ذلك مع قواعد بيانات SQL كنا بحاجة صراحة إلى كائن
لرسم الخرائط العلائقية ليتم وضعها بين قاعدة البيانات وتطبيقنا نفسه.
لأنه داخل التطبيق سوف ننظر في
الكائنات ولكن تخزينها في قاعدة بيانات سكل سيكون في شكل سجلات،
وبالتالي تحتاج إلى تعيين صريح.
كما رأينا مع قاعدة بيانات NoSQL،
لم يكن هذا مطلوبًا بشكل صريح.
ولكن إذا كنت بحاجة إلى فرض بنية على مستنداتك المخزنة في مجموعة،
فإن استخدام Mongoose لفرض هذا الهيكل مفيد للغاية.
الطريقة التي يدور بها Mongoose حول
فرض الهيكل على المستندات هي من خلال استخدام المخطط.
مخطط، ويحدد هيكل وثائقها.
دعونا نتحدث عن ذلك بمزيد من التفصيل.
لذا، ما هو مخطط النمس بالضبط،
وماذا يجلب إلى الطاولة؟
مخطط Mongoose، ينطوي على بنية
على البيانات المخزنة في مستند في قاعدة البيانات الخاصة بك.
لذلك، فإنه يحدد جميع حقول المستند الخاص بك،
ويحدد أيضا أنواع الحقول،
وأيضا يمكن أن توفر لنا مع
ميزات إضافية التي يمكن تمكين التحقق من صحة هذه الحقول.
لذلك، على سبيل المثال، تتضمن أنواع المخططات المختلفة المدعومة في Mongoose: سلسلة،
رقم، تاريخ، المخزن المؤقت، منطقي،
مختلط، معرف الكائن، و صفيف. على
وجه الخصوص سوف ننظر في رقم السلسلة
، وتاريخ، ومنطقية في التمرين الذي يلي.
وسوف ننظر في بعض من غيرها في تمارين لاحقة. على
وجه الخصوص، لاحظ استخدام نوع مخطط الصفيف.
لذلك، سيسمح لك نوع مخطط الصفيف
بإنشاء مصفوفة من المستندات الفرعية داخل المستند.
سأتحدث عن ذلك في فترة قصيرة
بمجرد تحديد مخطط،
يتم استخدام المخطط في Mongoose لإنشاء دالة نموذج،
وهذا ما يمكّنك من تحديد بنية المستندات الخاصة بك في قاعدة البيانات.
المخططات نفسها يمكن أن يكون التعشيش.
لذلك، مما يعني أنه يمكن أن يكون لديك مستند فرعي يتم تضمينه داخل مستند.
عادة ما يتم استيعاب المستندات الفرعية
إما من خلال
تحديد مخطط إضافي، ومن ثم تحديد أحد حقول المخطط ليكون خارج نوع المخطط الآخر.
أو يمكنك حتى الذهاب مع صفيف من
نوع مخطط آخر داخل مخطط ثاني تقوم بتعريفه.
دعونا ننظر إلى مثال لتوضيح بعض هذه بمزيد من التفصيل.
سيكون هذا المثال من التمرين الذي ستقوم به مباشرة بعد هذه المحاضرة.
قبل أن أتمكن من التحدث عن المخططات والنماذج في Mongoose،
دعونا نفهم لماذا نحتاج إلى ذلك.
إذا كنت قد أخذت الزاوي السابق،
أو الأيونية، أو البرنامج النصي الأصلي،
فقد رأيت أننا نمثل
البيانات المختلفة التي نستخدمها في تطبيقاتنا في شكل سلاسل JSON.
لذلك، في تطبيقنا نحدد مجموعة تسمى الأطباق.
في مجموعة طبق،
سيحتوي كل طبق على مجموعة معينة من الخصائص المحددة في شكل سلسلة JSON،
كما ترى في هذا المثال هنا.
لذلك، فإن الأطباق هي مجموعة من نوع الطبق،
وسوف يحتوي كل طبق نفسه على اسم
، صورة، فئة،
تسمية، وهلم جرا.
أيضًا، داخل مستند الطبق نفسه،
سيكون لديك تعليقات يتم تخزينها كمجموعة من مرة أخرى، -
مستندات JSON التي تحتوي على خطوة حقول محددة.
لذلك، كل تعليق، على سبيل المثال،
يحتوي على مؤلف تعليق تصنيف وحقل تاريخ كما ترى في هذا المثال هنا.
لذلك، ترى أن هناك بنية واضحة
لكل وثيقة تحدد الطبق الذي يتم تخزينه في قاعدة البيانات الخاصة بنا.
من الواضح أنه سيتم تخزين أطباق متعددة في شكل مجموعة في قاعدة البيانات الخاصة بنا،
ويمكن تجميعها معًا وإرسالها كمجموعة من
الأطباق لتطبيق العميل الخاص بنا ليتم استخدامها.
الآن بعد أن فهمنا كيف يتم تعريف هذا، الآن،
كيف يرتبط هذا بمخطط النمس والنموذج الذي نعرفه في النمس؟
الآن، لاحظ هيكل وثيقة طبق نموذجي هنا.
لذلك، يمكن تعيين هذا بسهولة في مستند MongoDB في مجموعة،
ربما سميت مجموعة الأطباق.
لذلك، نرى أن هناك بنية واضحة للوثيقة نفسها.
الآن، كيف يمكننا عكس هذا في مخطط في تطبيق Mongoose الخاص بنا؟
كما ستتعلم في التمرين،
سنرى أننا سنحدد المخططات في Mongoose.
لذلك يتم تعريف المخطط كمخطط Mongoose هنا.
على سبيل المثال، يتم عرض تعليق هنا.
يحتوي التعليق، كما ترى، على ثلاثة حقول مختلفة: التصنيف والتعليق
وحقل المؤلف،
وكذلك الطوابع الزمنية هنا.
تسمح لك الطوابع الزمنية بالحصول على حقلين مختلفين في
المستند: الحقل الذي تم إنشاؤه في الحقل وتحديثه في الحقل،
وكلاهما طوابع زمنية مخزنة في شكل سلسلة تاريخ ISO في المستند.
الآن، التصنيف نفسه سيكون قيمة عدد صحيح.
لذلك، في مصطلحات Mongoose،
سيتم تخزينها
كرقم، سيكون النوع رقمًا.
يمكنك حتى تحديد الحد الأدنى والقيمة القصوى.
يمكنك أيضًا تحديد أن هذا الحقل المحدد مطلوب، لذلك،
مما يعني أن كل مستند من نوع التعليق يجب أن يحتوي على حقل تصنيف.
وبالمثل، يمكنك أيضًا تحديد حقل تعليق،
وهو من سلسلة النوع.
لذا، من الواضح أن التعليق ليس سوى سلسلة تحتوي على بعض المعلومات،
وهذا يمكن تعريفه أيضًا كحقل مطلوب،
مما يعني أن كل مستند يجب أن يحتوي على تعليق،
وكذلك حقل مؤلف،
وهو أيضًا من سلسلة النوع.
لذلك، ترى ذلك من خلال تحديد هذا المخطط في هذا التنسيق.
كما تعلمنا في المناقشة قليلاً في وقت سابق،
يتم تعريف المخطط باستخدام الأنواع المختلفة التي لدينا في تطبيق Mongoose الخاص بنا.
لذلك، في المخطط، مرة أخرى،
ترى ثلاثة حقول مختلفة هنا،
التصنيف، التعليق، والمؤلف هنا،
ولكل منها نوع معين معين معين،
وبعد ذلك ما إذا كان هذا مطلوبًا أم لا.
لذلك، وبالتالي، أنت تفرض بنية صارمة
على وثائق التعليق التي سيتم تخزينها في التطبيق الخاص بك.
الآن بعد أن حددنا مخطط تعليق، يمكننا بعد ذلك،
كما لاحظت من مثال نوع البيانات التي نطلبها في طلبنا،
لدينا وثيقة طبق نفسها.
يحتوي مستند الطبق على حقول مختلفة.
هنا، في التمرين،
سنقوم أولاً بإدخال حقلين فقط في مستند الطبق،
والاسم، والوصف.
في الدرس التالي،
سوف نقدم الحقول المتبقية لديششيما.
الآن، وبالتالي فإن الاسم،
كما هو الحال في هذه الحالة،
هو من سلسلة النوع.
يمكننا أيضًا تحديد أن هذا حقل مطلوب،
مما يعني أن كل مستند يجب أن يحتوي على حقل الاسم.
يمكننا أيضًا تحديد أن حقل الاسم فريد،
مما يعني أنه لا يوجد وثيقتان يمكن أن يكون لهما نفس قيمة الاسم بالضبط في المستند.
لذلك، يضمن ذلك أن يكون لكل مستند
حقل اسم فريد فيه وحقل وصف،
وهو مرة أخرى من سلسلة النوع،
ولكن يتم تحديده أيضًا حسب الحاجة.
الآن، كما رأينا في المثال،
يحتوي مستند الطبق على تعليقات متعددة محاطة داخل المستند.
الآن، في Mongoose، يتم دعم هذا من خلال استخدام الوثائق الفرعية.
لذلك، إذا قمت بتعريف مخطط في وقت سابق
، لذلك على سبيل المثال، قمنا بالفعل
بتعريف تعليق هنا، يمكنك أيضًا تحديد حقل في مخطط آخر تقوم بتعريفه
ثم تحديد أن هذا الحقل سيكون
من نوع المخطط السابق الذي قمت بتعريفه.
لذا، في هذه الحالة،
حقل التعليقات، أقوم بتعريفه كمصفوفة،
لذلك ترى استخدام نوع مصفوفة في المخطط الخاص بك الذي تحدده هنا،
ثم صفيف من نوع التعليقات.
لذلك، هذا هو مجموعة من التعليقات التي سيتم تضمينها في كل وثيقة طبق.
لذلك، وبالتالي، يمكن أن يكون لديك
أكثر من وثيقة فرعية تعليق داخل وثيقة طبق.
لذا، فإن تعريف البنية مثل هذا يمكّننا
من دعم بنية سلسلة JSON المقابلة التي حددناها
لمستند طبق أو رأيناها في المثال سابقًا.
الآن، بمجرد أن نحدد المخطط،
للاستفادة من هذا في تطبيقنا،
نحتاج إلى إنشاء نموذج من هذا المخطط الذي حددناه للتو.
لذلك، ضمن تطبيقنا،
سنقوم بتعريف نموذج Mongoose وتحديد أن النموذج
خارج نوع DishSchema في هذا المثال.
ليس هذا فقط، سوف تعطي أيضا اسما للنموذج هنا.
لذلك، عندما تعطي اسمًا للنموذج هنا،
نحدد الاسم كطبق.
الآن، عند استخدام نموذج الطبق هذا في
تطبيق العقدة لدينا حيث نستخدم النمس،
فسيتم تحويل هذا وتعيينه إلى مجموعة في قاعدة بيانات MongoDB الخاصة بي.
سيتم تسمية المجموعة نفسها كأطباق.
لذا، يعرف Mongoose تلقائيًا أنه عند تحديد اسم هنا،
سيقوم تلقائيًا بإنشاء صيغة الجمع
لهذا الاسم ثم إعطاء المجموعة الاسم،
وهو صيغة الجمع لاسم النموذج الذي تحدده في هذا المثال هنا.
لذلك، عندما أقول طبق هنا،
ثم Mongoose تلقائيا سوف خريطة هذا في
مجموعة الأطباق في قاعدة بيانات MongoDB.
كيف تعرف كيفية تحويل هذا الاسم المفرد إلى صيغة الجمع؟
يحتوي Mongoose تلقائيًا على آلية مدمجة
تمكنها من بناء عدد وافر من الكلمات الإنجليزية القياسية.
لذلك، إذا كنت تقول طبق،
فإنه سيتم بناء الأطباق.
إذا كنت تقول زعيم، فإنه سيتم بناء الجمع منه كقادة، وهلم جرا.
لذلك، تم دمج هذا بالفعل في وحدة عقدة Mongoose.
لذا، هذا هو السبب عندما أحدد هذا كنوع نموذج طبق،
فإن Mongoose سيقوم ببناء مجموعة الأطباق في قاعدة بيانات MongoDB الخاصة بي،
ثم ستقوم مجموعة الأطباق بتخزين
المستندات المختلفة لنوع الطبق هناك.
بمجرد إنشاء ذلك، عادة،
عندما نعلن عن نماذج في تطبيقنا،
سنقوم بتخزينها في مجلد فرعي يسمى نماذج، فقط للراحة.
لا تحتاج إلى القيام بذلك،
ولكن فقط لتنظيم التطبيق الخاص بك،
سنقوم عادة بتخزين ذلك في مجلد باسم النماذج.
ثم سيتم
تعريف المخطط والنموذج في ملف مثل هذا كما ترى في المثال هنا،
وهذا يسمى dishes.js، ومن ثم سيتم تصدير هذا لأن هذا هو وحدة عقدة.
سيتم تصدير هذا من هذا الملف بحيث يمكن تضمينه في تطبيق العقدة،
حيث سنقوم باستخدام
هذا المخطط والنموذج الذي حددناه للتو هنا.
مع هذا الفهم السريع للمخطط والنموذج
واستخدامه في تحديد بنية مستند نقوم بتخزينه في MongoDB،
دعنا نعود ونفهم المزيد حول ما يوفر Mongoose لنا.
بالإضافة إلى ذلك، يتيح لنا Mongoose إنشاء الاتصال بخادم MongoDB.
يستخدم Mongoose داخليًا
برنامج تشغيل MongoDB الذي استخدمناه في التمرين السابق.
لذا، يعتمد Mongoose على برنامج تشغيل MongoDB، لذلك،
مما يعني أنه من تطبيق العقدة المستندة إلى Mongoose،
يمكنك استخدام جميع الطرق
المتوفرة بالفعل من برنامج تشغيل MongoDB أيضًا إذا اخترت ذلك،
ولكن Mongoose نفسه لديه مجموعته الخاصة من الطرق التي
يمكننا جعلها للتفاعل مع قاعدة بيانات MongoDB،
كما سنرى في التمرين التالي.
اسمحوا لي أن تظهر لكم بإيجاز كيف يمكننا إنشاء اتصال إلى قاعدة البيانات،
وسوف تفعل ذلك في الممارسة التي تلي ذلك.
لذا، تمامًا كما أعلنا عنوان URL في
حالة تطبيق عقدة MongoDB في الدرس السابق،
سنعلن عن عنوان URL لتطبيقنا.
ثم سنستخدم طريقة اتصال Mongoose
وتوفير عنوان URL لطريقة اتصال Mongoose،
وهذا سينشئ الاتصال بقاعدة البيانات.
مع هذا الفهم السريع للنمس والدور الذي
يلعبه Mongoose في دعم الإدراج المنظم
والتخزين واسترجاع الوثائق من MongoDB لدينا،
دعونا ننتقل إلى التمرين حيث
نحصل على بعض الخبرة العملية باستخدام وحدة Mongoose.