مقدمه

خیلی از اپلیکیشن‌های وب برای ذخیره‌ی داده‌ها و اطلاعات مورد نیاز خود به یک دیتابیس نیاز دارند. MongoDB یک نرم‌افزار مدیریت دیتابیس است که در سال‌های اخیر به محبوبیت زیادی رسیده است. درس جاری از دو بخش تشکیل می‌شود. ابتدا یک معرفی سریع و گذرا از MongoDB ارائه می‌شود که البته اگر با MongoDB آشنایی دارید، می‌توانید از آن عبور کنید و سپس، در بخش دوم روش نصب MongoDB و کانفیگ آن برای استفاده در اپ‌های Express ارائه خواهد شد.

آشنایی با MongoDB

سیستم‌های دیتابیس کلاسیک مانند MySQL و PostgreSQL داده‌ها را در قالب جداول و سطرها ذخیره و سازماندهی می‌کنند و برای دسترسی و دستکاری داده‌ها به زبان SQL متکی هستند. اما MongoDB یک سیستم دیتابیس NoSQL است که از مدل داده‌ای مبتنی بر سند (document-oriented) استفاده می‌کند. یعنی داده‌ها را به جای جداول، در قالب یک مجموعه‌ از فایل‌های متنی یا JSON ذخیره می‌کند که در هر فایل یا سند، اطلاعات مربوط به یک شیء خاص ذخیره می‌شود.

فرض کنید می‌خواهیم اطلاعات مشتریان یک فروشگاه آنلاین را ذخیره کنیم. در یک دیتابیس کلاسیک، باید یک جدول به موجودیت مشتری اختصاص دهیم و فیلدهای مشخصی مانند نام، آدرس و غیره را به عنوان ستون‌های جدول تعریف کنیم و به ازای هر مشتری، یک سطر به جدول اضافه کنیم. پس، همه‌ی مشتری‌ها فیلدهای یکسانی دارند. اما در یک دیتابیس NoSQL مانند MongoDB یک کالکشن برای موجودیت مشتری تعریف می‌کنیم و اطلاعات هر مشتری را درون یک سند یا document قرار می‌دهیم. بنابراین، هر مشتری یک سند جداگانه دارد و می‌تواند فیلدهای خاص خودش را داشته باشد.

داده‌ها در سند به فرمت JSON ذخیره می‌شوند که یک فرمت متن‌باز و محبوب برای نمایش داده‌های ساختاریافته در وب است.

Copy Icon JSON
{
  "name": "Tom",
  "age": 19,
  "email": "tom@example.com",
}

به این ترتیب، می‌توانیم اطلاعات متنوع را به راحتی و بدون نیاز به تغییر ساختار دیتابیس، ذخیره کنیم. با این حساب، اجزای اصلی یک دیتابیس MongoDB از این قرارند:

  • کالکشن (collection): در MongoDB کالکشن‌ها معادل جدول‌ها در SQL هستند. اما با این تفاوت که کالکشن‌ها مقید به ساختار خاصی نیستند و سندهای یک کالکشن می‌توانند ساختارهای مختلفی داشته باشند.
  • سند (document): در MongoDB یک سند معادل یک رکورد در جداول دیتابیس‌های کلاسیک است. یک نمونه سند را در بالا مشاهده کردید که اطلاعات یک مشتری را نگه می‌دارد.
  • فیلد (field): در MongoDB یک فیلد به یک ویژگی یا مشخصه از سند اشاره می‌کند. در مثال بالا، name، age و email فیلد هستند.

در دیتابیس‌های مبتنی بر SQL، داده‌های مرتبط از طریق کلیدهای خارجی و روابط بین جداول به هم مرتبط می‌شوند. اما ماهیت مبتنی بر سند دیتابیس‌های NoSQL آنها را به دیتابیس‌های غیر رابطه‌ای تبدیل می‌کند. البته این به این معنا نیست که در MongoDB راهی برای برقراری ارتباط بین داده‌ها وجود ندارد. در ادامه، با یک مثال خواهیم دید که چطور می‌توانیم ارتباط مورد نیاز بین داده‌ها را در MongoDB ایجاد کنیم.

یک مثال ساده از MongoDB

فرض کنید یک سایت فروشگاهی داریم و می‌خواهیم اطلاعات محصولات و مشتریان را ذخیره کنیم. ساختار دیتابیس ما می‌تواند به این صورت باشد که یک کالکشن برای محصولات و یک کالکشن برای مشتریان داشته باشد.

هر سند در کالکشن مربوط به محصولات، به یک محصول مشخص مربوط است و اطلاعات آن را نگه می‌دارد. مثلاً سند نمونه‌ی زیر اطلاعات مربوط به یک لپ‌تاپ را نگه می‌دارد.

Copy Icon JSON
{
  "product_id": "p123",
  "brand": "asus",
  "model": "N550JK",
  "color": "black",
  "price": 1000
}

در کالکشن مربوط به مشتریان هم یک سند نمونه می‌تواند به صورت زیر باشد.

Copy Icon JSON
{
  "customer_id": "c001",
  "name": "tom",
  "email": "tom@example.com",
  "orders": [{product_id: "p123", quantity: 2}]
}

همانطور که می‌بینید، فیلد orders که بیانگر سفارشات مشتری است، یک آرایه از اشیاء است که هر شیء مشخصات یک سفارش را شامل است و از جمله، یک پراپرتی با نام product_id دارد که محصول حریداری‌شده را مشخص می‌کند و به این ترتیب، ارتباط لازم ایجاد می‌شود.

نصب و کانفیگ MongoDB

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

حالا باید یک پروژه‌ی Express ایجاد کنیم و آن را برای اتصال به MongoDB تنظیم کنیم. ابتدا با استفاده از کامندهای زیر، یک پروژه ایجاد می‌کنیم.

mkdir test 
cd test 
npm init -y 
          

کامند اول، یک دایرکتوری با نام test می‌سازد، کامند دوم آن را به عنوان دایرکتوری جاری تعیین می‌کند و کامند سوم، یک فایل package.json با مقادیر پیش‌فرض ایجاد می‌کند. مثل قبل، مقدار فیلد name را در این فایل به app.js تغییر دهید و یک فایل با همین نام در دایرکتوری پروژه ایجاد کنید.

حالا پکیج‌های مورد نیاز را با استفاده از کامند زیر نصب کنید.

npm install express morgan mongoose dotenv

این کامند علاوه بر express و morgan دو پکیج دیگر را هم به پروژه اضافه می‌کند. پکیج اول mongoose نام دارد که یک کتابخانه‌ی محبوب برای کار با MongoDB در پروژه‌های Node.js است. این کتابخانه با ایجاد یک لایه روی MongoDB کار با آن و ساخت مدل‌های ساخت‌یافته را ساده‌تر می‌کند. پکیج دوم هم dotenv نام دارد و برای مدیریت متغیرهای محیطی و محافظت از اطلاعات حساس کاربرد دارد. کاربرد هر دو پکیج را در این درس و درس بعدی خواهیم دید.

توجه داشته باشید که ما به پکیج mongodb هم نیاز داریم اما وقتی mongoose را نصب کنیم، mongodb هم به طور خودکار نصب می‌شود. اگر بخواهیم ارتباط با MongoDB را بدون استفاده از mongoose هندل کنیم، باید در کامند بالا به جای mongoose از mongodb استفاده کنیم.

در دایرکتوری اصلی پروژه یک فایل با نام .env ایجاد کنید. این فایلی است که متغیرهای محیطی را در آن ذخیره می‌کنیم. جالا باید Connection String یا رشته‌ی اتصال به MongoDB را در قالب یک متغیر محیطی به این فایل اضافه کنیم. اگر از یک سرور لوکال استفاده می‌کنید، رشته‌ی اتصال باید به صورت زیر باشد.

Copy Icon .env
MONGODB_URI = mongodb://localhost:27017

حالا یک دایرکتوری با نام libs در ریشه‌ی پروژه ایجاد می‌کنیم و فایل dbConnect.js را با محتوای زیر در آن قرار می‌دهیم.