اعتبارسنجی ساختار (schema validation)

Schema Validation in MongoDB

19 بهمن 1400
درسنامه درس 23 از سری دوره جامع آموزش MongoDB
MongoDB: اعتبار سنجی ساختار (schema validation) (قسمت 23)

همانطور که قبلا بار ها توضیح داده ایم، پایگاه داده MongoDB یک پایگاه داده بسیار انعطاف پذیر است تا جایی که می توانید داده های خود را بدون ساختار قبلی وارد collection ها نمایید. این انعطاف پذیری در اکثر اوقات خصوصیت مثبتی به حساب می آید اما در برخی از موارد لازم است آن را حذف کنیم. برخی از برنامه هایی که تعریف  می شود دارای ساختاری از قبل تعیین شده هستند و به هیچ عنوان نباید داده هایی خلاف این ساختار را قبول کنند.

به طور مثال در یک برنامه بانکی مشخص است که موجودی حساب یک کاربر باید حتماً یک عدد باشد نه رشته بنابراین نیازی به انعطاف پذیری MongoDB نداریم، چه بسا که این انعطاف پذیری به امنیت برنامه ما ضرر بزند. این مسئله می تواند حتی در برنامه های ساده تر مانند یک وب سایت فروشگاهی نیز پیاده سازی شود. ما می دانیم در چنین برنامه ای حتماً محصولات خود را به همراه توضیحات و عکس و قیمت آن ها دریافت خواهیم کرد بنابراین نیازی نیست که هیچ کدام از این فیلد ها، داده هایی غیر از داده های خودشان را دریافت کنند. بلکه اگر چنین اتفاقی بیفتد برنامه ما با خطا روبرو می شود (البته پایگاه داده هیچ عکس العملی نشان نمی دهد چرا که ساختاری ندارد).

در چنین حالتی راه حل چیست؟ چطور می توانیم برای MongoDB یک schema یا ساختار از پیش تعریف شده تعیین کنیم؟ در چنین حالتی با مبحثی به نام schema validation یا اعتبار سنجی ساختار روبرو می شویم. ما می‌توانیم در MongoDB یک ساختار خاص را به عنوان schema خود معرفی کنیم و از آن به بعد هر دستور write یا ثبت داده (مثل insertOne یا insertMany یا updateOne و الی آخر) قبل از اعمال شدن اعتبار سنجی می شود. مثلا اگر برای فیلد name تعیین کرده باشیم که حتما رشته ای باشد، اما مقداری عددی به آن بدهیم، MongoDB به ما خطا می دهد.

سطوح مختلف اعتبار سنجی Schema

برخلاف آنچه که تصور می شود MongoDB سطوح مختلفی از اعتبار سنجی را به شما ارائه می دهد. ما می توانیم دو موضوع اصلی را در اعتبار سنجی ساختار خود مشخص کنیم: موضوع اول این است که اعتبارسنجی در کدام عملیات ها اجرا شود. موضوع دوم نیز این است که اگر اعتبار سنجی موفقیت آمیز نبود چه اتفاقی بیفتد. برای موضوع اول (عملیات ها) می توان گفت:

  • strictیعنی تمام دستورات insert و update  بررسی و اعتبار سنجی شوند.
  • moderateیعنی تمام دستورات insert  برسی می شوند اما دستورات update  فقط برای document هایی بررسی می شود که از قبل معتبر بوده اند. با انتخاب این گزینه، اگر داده های نامعتبری از قبل در پایگاه داده شما وجود داشته باشد (قبل از اینکه اعتبارسنجی را تعریف و اعمال کنید از پایگاه داده استفاده می کردید) به آن ها توجه نخواهد شد، در صورتی که در حالت strict داده هایی که از قبل نامعتبر باشند نیز خطا می گیرند.

برای موضوع دوم (عملیات پس از نامعتبر بودن نتیجه اعتبار سنجی) دو مورد ممکن است:

  • اعلام خطا توسط MongoDB (پرتاب error) و نادیده گرفتن کوئری شما (در این حالت دستور شما اجرا نمی شود).
  • اعلام هشدار توسط MongoDB (پرتاب warning) و اجرای کوئری (به شما هشدار داده می شود اما به هر حال دستور را اجرا می کند).

در نهایت انتخاب گزینه صحیح  کاملاً به برنامه شما بستگی دارد.

کار با schema validation

حالا که با مفهوم 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 استفاده می کنم اما هر ویرایشگری که بتواند با دستورات جاوا اسکریپت ساده کار کند نیز مورد قبول است.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری دوره جامع آموزش MongoDB توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مقالات مرتبط
آخرین سوالات کاربران
5451218 در 3 سال قبل پرسیده:
ما را دنبال کنید
اینستاگرام روکسو تلگرام روکسو ایمیل و خبرنامه روکسو