همانطور که قبلا بار ها توضیح داده ایم، پایگاه داده MongoDB یک پایگاه داده بسیار انعطاف پذیر است تا جایی که می توانید داده های خود را بدون ساختار قبلی وارد collection ها نمایید. این انعطاف پذیری در اکثر اوقات خصوصیت مثبتی به حساب می آید اما در برخی از موارد لازم است آن را حذف کنیم. برخی از برنامه هایی که تعریف می شود دارای ساختاری از قبل تعیین شده هستند و به هیچ عنوان نباید داده هایی خلاف این ساختار را قبول کنند.
به طور مثال در یک برنامه بانکی مشخص است که موجودی حساب یک کاربر باید حتماً یک عدد باشد نه رشته بنابراین نیازی به انعطاف پذیری MongoDB نداریم، چه بسا که این انعطاف پذیری به امنیت برنامه ما ضرر بزند. این مسئله می تواند حتی در برنامه های ساده تر مانند یک وب سایت فروشگاهی نیز پیاده سازی شود. ما می دانیم در چنین برنامه ای حتماً محصولات خود را به همراه توضیحات و عکس و قیمت آن ها دریافت خواهیم کرد بنابراین نیازی نیست که هیچ کدام از این فیلد ها، داده هایی غیر از داده های خودشان را دریافت کنند. بلکه اگر چنین اتفاقی بیفتد برنامه ما با خطا روبرو می شود (البته پایگاه داده هیچ عکس العملی نشان نمی دهد چرا که ساختاری ندارد).
در چنین حالتی راه حل چیست؟ چطور می توانیم برای MongoDB یک schema یا ساختار از پیش تعریف شده تعیین کنیم؟ در چنین حالتی با مبحثی به نام schema validation یا اعتبار سنجی ساختار روبرو می شویم. ما میتوانیم در MongoDB یک ساختار خاص را به عنوان schema خود معرفی کنیم و از آن به بعد هر دستور write یا ثبت داده (مثل insertOne یا insertMany یا updateOne و الی آخر) قبل از اعمال شدن اعتبار سنجی می شود. مثلا اگر برای فیلد name تعیین کرده باشیم که حتما رشته ای باشد، اما مقداری عددی به آن بدهیم، MongoDB به ما خطا می دهد.
برخلاف آنچه که تصور می شود MongoDB سطوح مختلفی از اعتبار سنجی را به شما ارائه می دهد. ما می توانیم دو موضوع اصلی را در اعتبار سنجی ساختار خود مشخص کنیم: موضوع اول این است که اعتبارسنجی در کدام عملیات ها اجرا شود. موضوع دوم نیز این است که اگر اعتبار سنجی موفقیت آمیز نبود چه اتفاقی بیفتد. برای موضوع اول (عملیات ها) می توان گفت:
برای موضوع دوم (عملیات پس از نامعتبر بودن نتیجه اعتبار سنجی) دو مورد ممکن است:
در نهایت انتخاب گزینه صحیح کاملاً به برنامه شما بستگی دارد.
حالا که با مفهوم schema validation آشنا شدیم باید بدانیم که نحوه پیاده سازی آن در عمل چگونه است. من مقدمات این بحث را در این جلسه انجام می دهم و از جلسه بعد به صورت عملی شروع به کار می کنیم.
ساده ترین راه برای پیاده سازی schema validation تعریف آن در هنگام ساخت یک collection است. همانطور که می دانیم هر زمانی که یک document را insert کنیم، collection ما نیز ساخته می شود که روش غیر مستقیم (implicit) ساخت collection است اما برای ایجاد schema validation باید هر collection را به صورت مستقیم (explicit) تعریف کنم. بنابراین ابتدا post (همان collection ای که در پروژه وبلاگ و در جلسات قبل داشتیم) را حذف می کنم:
use blog db.posts.drop()
سپس از متد createCollection برای ساخت یک collection جدید استفاده می کنیم:
db.createCollection()
این متد انواع و اقسام آرگومان ها را دریافت می کند. به طور مثال اولین آرگومانی که قبول می کند نام collection جدید شما است:
db.createCollection("posts")
ما تا به حال با این متد کار نکرده بودیم چرا که در اکثر مواقع نیازی به آن نیست و استفاده از روش غیر مستقیم (insert کردن داده) برای ساخت collection ها کافی است. ما فقط زمانی از createCollection استفاده می کنیم که بخواهیم تنظیمات خاصی را برای collection خود در نظر بگیریم. من بعضی از آرگومان های قبول شده توسط این متد را در قالب یک مثال برایتان آورده ام:
db.createCollection("posts", {validator: {$jsonSchema: {bsonType: "object", required: ["title", "text", "creator", "comments"]}}})
همانطور که می بینید تعداد این آرگومان ها زیاد است و زیاد تر هم می شود بنابراین این بار به جای تایپ کردن آن ها در shell (پنجره command prompt یا ترمینال شما) به یک ویرایشگر کد می روم (هر ویرایشگری باشد مهم نیست) تا کد ها را در این قسمت برایتان توضیح بدهم. من به شخصه از VSCode استفاده می کنم اما هر ویرایشگری که بتواند با دستورات جاوا اسکریپت ساده کار کند نیز مورد قبول است.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.