مقدمه#

mongodb معروف ترین دیتابیس منبع باز nosql هست که دیتا هارو در قالب json (یا جزیی تر بگیم در آبجکت bson خودش) ذخیره میکنه. در mongodb داده ها در collection ها ذخیره میشن که این collection ها مجموعه ای از مقادیر json ای هستن.

bson (binary json) طریقه ذخیره سازی دیتا های json توسط mongodb هست که دیتا هارو داخل فایل های کم حجم ذخیره میکنه و باعث بهینه سازی و دسترسی راحت تر توسط توسعه دهنده ها میشه

حالا چرا nosql؟ مگه sql چه مشکلی داره؟#

sql مشکل بخصوصی نداره. عموما دلیل استفاده از دیتابیس های nosql مثل همین mongodb و کلا دلیل ساختشون انعطاف پذیری توی داده های مورد استفادمون هست. توی این نوع دیتابیس ها لازم نیست که حتما ساختار داده و تمام صفت ها و پارامتر های مورد استفادمون رو از قبل بدونیم و از قبل برای داده هامون schema (قالب اولیه) تعریف کنیم. و هروقت که بخوایم میتونیم داده های ورودی به شکل دلخواه تغییر بدیم و با فرمت های مختلف وارد دیتابیس کنیم.

انعطاف پذیری (flexibility)#

مثال زیر رو یه نگاه بندازین. فرضا میخوایم اطلاعات لباس زیر رو وارد دیتابیس کنیم

نام لباس: پلیور یقه لاکپشتی – رنگ: سبز – سایز: 2XL

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

color size clothes_name cid
سبز 2XL پلیور یقه لاکپشتی 1

درصورتی که در دیتابیس های nosql برای اضافه کردن صفت جدید کافیست صرفا در رکورد های بعدی آن صفت را اضافه کنیم و نیاز به تغییری در ساختار دیتابیس نداریم

{
  "cid": 1,
  "clothes_name": "پلیور یقه لاکپشتی",
  "size": "2XL"
  "color": "سبز",
  "origin_country": "france"

}

مقیاس پذیری (scalability)#

scaling

دیتابیس های sql از اول برای مقایس پذیری عمودی (افزایش منابع سرور) ساخته شده بودن و ساختارشون هم تطابق با این مدل رو توجیه میکنه. و مقیاس پذیری عمودی در ابعاد بزرگ بسیار پر هزینه هست. اشتباه نکنین دیتابیس های nosql میتونن مقیاس پذیری افقی (افزایش تعداد سرور ها) رو هم داشته باشن ولی بخاطر ساختارشون توی این نوع مقیاس پذیری با کاهش پرفورمنس و افزایش overhead مواجه میشن. چطوری؟ اینطوری میشه که مثلا بعضی از جداول که بهم مرتبطن داخل سرور های مختلف ذخیره میشن و وقتی query میزنیم و حاصل query مون شامل جواب از چندتا از این جدول ها میشه سرور دریافت کننده query باید مقادیر این جداول رو از سرورای مختلف جمع کنه که این هزینه زمانی و پرفورمنسی بالایی داره.

حالا اینجا mongodb چیکار میکنه؟ mongodb داده هارو بصورت یکجا ذخیره میکنه یعنی میاد دیتابیس رو به خورده های کوچیک تقسیم میکنه(sharding) و بین سرورا تقسیم میکنه. اینطوری هر رکوردمون بطور کامل با مقادیرش داخل یک سرور بخصوص (از بین چندتا سرورمون) ذخیره میشه و دیگه چندتا query به چندتا سرور مختلف نخواهیم داشت

سرعت عملکرد (performance)#

در مواقعی که تعداد join ها یا تعداد داده های ترکیبی با فرکانس بالا فراخوانی میشن استفاده از mongodb میتونه مزیت سرعتی داشته باشه. برای مثال وقتی وارد اپلیکشن اسنپ فود میشیم و یکی از رستوران هارو انتخاب میکنیم اطلاعات رستوران. نظرات کاربران. اطلاعاتی هستن که به ما نمایش داده میشن. توی ساختار sql ای برای هرکدوم از این نوع داده ها باید یه جدول تعریف بشه. برای مثال باید جدول اطلاعات رستوران تعریف بشه و جداول نظرات کاربران و منوی غذا های اون رستوران از طریق کلید خارجی به جدولمون وصل بشن. اینطوری هروقت که کاربر یک رستوران رو انتخاب کنه به دیتابیسمون چندتا query مختلف زده میشه. یکی برای گرفتن نظرات کاربران یکی برای گرفتن منوی غذا ها و یکی برای گرفتن رستوران مدنظر از لیست رستوران ها

SELECT * FROM Restaurants WHERE name = 'Pizza Palace';

SELECT * FROM Menus WHERE restaurant_id = 1;

SELECT * FROM Reviews WHERE restaurant_id = 1;

SELECT r.name, r.address, m.item, m.price, v.user, v.comment
FROM Restaurants r
JOIN Menus m ON r.id = m.restaurant_id
JOIN Reviews v ON r.id = v.restaurant_id
WHERE r.name = 'Pizza Palace';

image-20241201000205595

درصورتی که در دیتابیس mongodb رکورد مرتبط با دیتا بصورت یکجا ذخیره میشود و یک query برای گرفتن تمام این رکورد زده شده که باعث افزایش performance در این مورد میشود

{
  "name": "iMan Pizza",
  "address": "123 Food Dooni",
  "menu": [
    { "item": "Margherita", "price": 10 },
    { "item": "Pepperoni", "price": 12 }
  ],
  "reviews": [
    { "user": "Asghar", "comment": "sosamo ja gozashtan" },
    { "user": "Asghar2", "comment": "bad nabood." }
  ]
}

نصب و استفاده#

  • با استفاده از داکر (Docker)#

برای نصب mongodb میتونیم از داکر استفاده کنیم.

version: "3.8"
services:
  mongodb:
    image: mongo
    container_name: mongodb
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
volumes:
  mongo-data:

این فایل داکر کامپوز یه کانتینر mongodb برامون بالا میاره. پورت 27017 (پیشفرض خود mongodb) رو برامون اکسپوز میکنه که بتونیم بهش وصل بشیم و یه volume برامون میسازه که حافظه ثابت دیتابیسمون باشه که اگه کانتینر رو پاک کردیم اطلاعاتمون حفظ بشه

  • با استفاده از MongoSH#

    mongosh(shell) ابزار استفاده از mongodb از طریق ترمینال هست که به ما قابلیت ارتباط با دیتابیسمون از طریق کامند رو میده.

    اینم چندتا دستور کاربردی برای شروع

    دستور شروع mongosh

    mongosh
    

    ساخت دیتابیس

    use mydatabase1
    

    ساخت کالکشن users و ورود دیتا نمونه

    db.users.insert({ name: "Asghar3", age: 26 });
    

    پیدا کردن کاربران با سن بالای 25

    db.users.find({ age: { $gt: 25 } })
    

    اپدیت کردن مقادیر کاربر

    db.users.updateOne({ name: "Asghar3" }, { $set: { age: 299 } })
    
  • Mongodb Compass (GUI)#

    این ابزار میاد یه رابط کاربری برای استفاده راحت تر از mongodb در اختیارمون میزاره. ولی خودش mongodb رو نداره و برامون دیتابیس ستاپ نمیکنه و صرفا پوسته هست. و باید درکنار یکی از دو ابزار بالا استفاده بشه.

  • MongoDB for VS Code (GUI)#

    این افزونه vscode هم یه رابط گرافیکی در اختیارتون قرار میده که مثل Mongodb C ompass میتونین ازش استفاده کنین.

    image-20241201004611311

بحث foreign key و join کردن دیتا توی mongodb چطور میشه؟#

ممکنه سوال براتون پیش بیاد که اقا ما توی دیتابیسای sql از join ها و primary/foreign key ها برای اتصال جداول و داده ها استفاده میکنیم. اینجا چی میشه؟

جواب کوتاه: https://chatgpt.com/share/674df73e-06a4-8004-98f2-fe67134eedc0 جواب طولانی: اگه استقبال شد توی پست بعد

امیدوارم که از این پست چیزی یاد گرفته باشین موفق و موید و پیروز باشین و کانال تلگرام رو هم یه سر بزنین#

https://t.me/area51_blog

منابع:

https://medium.com/@rsk.saikrishna/when-to-use-mongodb-rather-than-mysql-d03ceff2e922 https://www.w3schools.com/mongodb/

https://www.astera.com/type/blog/mongodb-vs-sql-server/#:~:text=For%20example%2C%20financial%20data%20for,logs%20can%20utilize%20MongoDB%20documents.

https://chatgpt.com (زیاد)