در قسمت قبل در رابطه با نحوه ساختاردهی و مدل سازی پایگاه داده صحبت کردیم و حالا نوبت به تعریف یک پایگاه داده جدید و شروع کار است. در ابتدا باید پایگاه داده قبلی خود را حذف کنیم. جهت یادآوری این کار را دوباره با هم انجام می دهیم:
use bookRegistry
با این کار وارد پایگاه داده می شویم. سپس می گوییم:
db.dropDatabase()
با اجرای کد بالا نتیجه زیر را می گیریم:
{ "dropped" : "bookRegistry", "ok" : 1 }
حالا پایگاه داده جدیدی به نام blog را تعریف می کنیم:
use blog
سپس باید collection دیگری به نام user را تعریف کنیم. من با یک دستور insertMany دو کاربر را به این collection اضافه می کنم:
db.users.insertMany([{name: "Amir", age: 24, email: "Amir@email.com"}, {name: "Nastaran", age: 30, email: "Nastaran@email.com"}])
همانطور که قبلا هم گفته ام دستور insertMany همیشه آرایه ای از Document ها را به عنوان پارامتر می گیرد. من دو document به آن داده ام و هر document یک کاربر یا نویسنده محسوب می شود. همچنین هر نویسنده یک فیلد نام، یک فیلد سن و یک فیلد ایمیل دارد. با اجرای این کد نتیجه زیر را می گیریم:
"acknowledged" : true, "insertedIds" : [ ObjectId("5e897545c067c6acacfda164"), ObjectId("5e897545c067c6acacfda165") ] }
یعنی دو ردیف ما با موفقیت اضافه شدند. همچنین اگر بخواهید document های اضافه شده را مشاهده کنید باید بگویید:
db.users.find().pretty()
طبیعتا نتیجه خروجی ما بدین شکل خواهد بود:
"_id" : ObjectId("5e897545c067c6acacfda164"), "name" : "Amir", "age" : 24, "email" : "Amir@email.com" } "_id" : ObjectId("5e897545c067c6acacfda165"), "name" : "Nastaran", "age" : 30, "email" : "Nastaran@email.com" }
بنابراین از نظر کاربران هیچ مشکلی نداریم. در مرحله بعد باید collection بعدی (post) را تعریف کنیم. من آن را با اضافه کردن یک پست می سازم:
db.posts.insertOne({title: "My first post!", text: "This is my first post, I hope you like it!", tags: ["new", "tech"], creator: ObjectId("5e897545c067c6acacfda165"), comments: [{text: "I liked this post!", author: ObjectId("5e897545c067c6acacfda164")}]})
بگذارید از این پست با pretty خروجی بگیریم تا ساختار آن بهتر نمایش داده شود:
"_id" : ObjectId("5e8977fcc067c6acacfda166"), "title" : "My first post!", "text" : "This is my first post, I hope you like it!", "tags" : [ "new", "tech" ], "creator" : ObjectId("5e897545c067c6acacfda165"), "comments" : [ { "text" : "I liked this post!", "author" : ObjectId("5e897545c067c6acacfda164") } ] }
در ابتدا یک id_ داریم که توسط خود MongoDB ساخته شده است. سپس title یا عنوان پست را داریم که من به دلخواه مقدار ! My first postرا برایش گذاشته ام (شما می توانید در تمام این فیلد ها هر مقداری که خواستید قرار دهید). Text همان متن پست است و باز هم به خودتان مربوط است که چه چیزی درون آن بگذارید اما یادتان باشد که متن شما می تواند بسیار طولانی باشد و اکثر پست ها نیز حجمی حدود 900 کلمه به بالا دارند که هیچ مشکلی نیست. تگ های هر پست را در tags ذخیره کرده ایم که یک لیست (آرایه) است. من دو تگ tech و new را در آن دارم که باز هم سلیقه ای است.
نکته مهم creator است که همان نویسنده پست است (به جای creator می توانستید هر فیلد دیگری را انتخاب کنید). همانطور که در جلسه قبل توضیح دادیم برای اینکه دچار مشکلات فراوان نشویم از id نویسنده استفاده کرده ایم (reference به جای embedded document). ما گفتیم که اگر اطلاعات کاربری را مستقیما درون post بگذاریم (embed شود) با مشکل بزرگی مواجه می شویم چرا که هر کاربر می تواند ده ها یا صد ها پست بگذارد و در همین ابتدا data duplication خواهیم داشت. همچنین اگر کاربر اطلاعات خود را تغییر دهد (مثلا ایمیل خود را عوض کند) ما باید آن را در صد ها پست مختلف ویرایش کنیم تا اطلاعات نویسنده سایت ما بر اساس آخرین نسخه موجود نمایش داده شود. من کاربر Nastaran (نویسنده ای که چند لحظه قبل ایجاد کردیم) را به عنوان نویسنده پاس داده ام. شما می توانید هر آیدی دیگری که برایتان تولید شده (قطعا آیدی های تولید شده برای شما با من تفاوت خواهد داشت) یا هر نویسنده دیگری که دارید را به این فیلد پاس بدهید.
سپس comments یا کامنت ها را داریم که یک embedded document است. در جلسه قبل هم گفتیم که embed کردن کامنت ها مشکلی ندارد چرا که کامنت ها و پست ها رابطه «یک به چند» دارند (یک پست چندین کامنت دارد اما هر کامنت فقط برای یک پست خواهد بود). همچنین در اکثر اوقات یک پست را به همراه کامنت های آن نشان می دهیم و نیازی به جداسازی و دریافت جداگانه آن ها نیست. Text یعنی متن کامنت و author یعنی نویسنده کامنت (باز هم می گویم که شما می توانستید هر نام دیگری برای این فیلد ها انتخاب کنید، مثلا commentText و writtenBy). نکته مهم این است که دقیقا به خاطر معایب ذکر شده در قبل برای embed کردن user ها، نویسنده کامنت را نیز نباید embed کنیم بلکه از آیدی یکی از کاربران (Amir) برای مشخص کردن نویسنده کامنت استفاده کرده ام.
در جلسه بعد به سراغ مبحث schema validation یا اعتبارسنجی ساختار می رویم و از این جلسه به بعد از شما انتظار دارم که بتوانید انواع و اقسام مدل سازی را برای پایگاه داده خود انجام بدهید. ما جلسات مختلفی را به این کار اختصاص داده و با حل مثال های متخلف ذهن شما را با این موضوعات آشنا کرده ایم. از این قسمت به بعد باید بتوانید هر نوع پایگاه داده ای را مدل سازی کنید گرچه مدل سازی در MongoDB از اول هم سخت نبود.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.