نسخه ی ویدیویی این آموزش را می توانید در آموزش ویدیویی سریع و راحت MongoDB در 30 دقیقه مشاهده کنید.
این مقاله برای مبتدیانی در نظر گرفته شده است که می خواهند به سرعت، اصول کار با MongoDB را بدون ورود به مستندات و آموزش های آن، یاد بگیرند.
MongoDB یک سیستم مدیریت پایگاه داده سند محور است که به هیچ طرح یا Schema از پیش تعریف شده ای نیاز ندارد.
MongoDB یکی از نمونه های اولیه و قدیمی دیتابیس های NoSQL است. این دیتابیس پرکاربرد، از اسناد JSON مانند و یک طرح پایگاه داده استفاده می کند. دیتابیس ها در توسعه ی برنامه ها و وب سایت ها، مورد استفاده قرار می گیرند. دیتابیس معروف MongoDB، به ویژه در شکل دهی به بسیاری از پشته های تکنولوژی (Technology Stack) در جاوااسکریپت، نقش پررنگی دارد. مانند MEAN ،MEVN ،MERN، که اغلب توسط توسعه دهندگان وب به عنوان پشته های فناوری مورد علاقه خود برای ایجاد برنامه ها، از آنها استفاده می کنند. در تمامی این پشته ها M ابتدای اسم MongoDB است و برای مثال MERN شامل چهار تکنولوژی MongoDB، Express ،React و Node می شود.
آموزش نصب MongoDB
نصب MongoDB کار خیلی ساده ای هست؛ شما می توانید نسخه ی مناسب با سیستم عامل تان را از وب سایت رسمی MongoDB دانلود کنید. من در این آموزش قصد دارم با استفاده از Docker یک نسخه از MongoDB را راه اندازی کنم و با استفاده از داکر به داخل کانتینر MongoDB رفته و مراحل کاری که در ادامه می گویم را انجام بدهم.
برای راه اندازی MongoDB با استفاده از داکر، تنها کافیست دستور زیر را روی کامپیوتری که داکر برروی آن نصب است، وارد کنید:
docker run --name mongodb-sokanacademy -d -p 27017:27017 -v "$PWD/db:/data/db" mongo:latest
یا در لینوکس به سادگی با استفاده از دستور زیر MongoDB را نصب کنید.
sudo apt install -y mongodb
و البته برای ارتباط با دیتابیس به Shell نیاز داریم که MongoShell یک گزینه ی خیلی خوب است. که می توانید آن را به صورت مجزا از اینجا دانلود کنید. البته در حالت معمول به همراه MongoDB نصب می شود. دانشجوهایی که از image داکر معرفی شده در بالا استفاده می کنند، نیازی به نصب جداگانه ی این Shell ندارند.
شروع کار با MongoDB
حالا که به MongoDB و MongoShell را نصب کردید، می توانید به راحتی با این دیتابیس محبوب ارتباط برقرار کنید. توجه داشته باشید که تمامی مراحل آموزش را من با استفاده از کانتینر داکر پیش می برم، ولی اگر شما از لینوکس، ویندوز یا MacOS استفاده می کنید هم، اصلا نگران نباشید. زیرا هیچ تفاوتی وجود ندارد.
بعد از وارد کردن دستور بالا برای راه اندازی کانتینر مربوط به MongoDB و در صورتی که همه چیز درست پیش رفته باشد، باید در جواب دستور docker ps لیستی از کانتینرهای درحال اجرا را خواهید دید.
حالا برای اینکه به داخل این کانتینر دسترسی داشته باشیم دستور زیر را وارد کنید:
docker exec -it mongodb-sokanacademy /bin/bash
اگر همه چیز درست پیش رفته باشد باید مثل من، وارد کانتینر شده باشید.
حالا همانطور که قبلا هم گفته بودم، برای برقراری ارتباط با دیتابیس MongoDB به MongoShell نیاز داریم. برای استفاده از این ابزار جهت مشاهده و ارسال دستور به دیتابیس و دریافت نتایج، تنها کافیست mongosh
را تایپ کرده و اینتر بزنید.
همانطور که در تصویر بالا هم مشاهده می کنید، ما در دیتابیسی با نام test هستیم. ولی خوب است بدانید، اصلا چنین دیتابیسی الان روی این سیستم وجود ندارد!😮
این موضوع برمی گردد به قاعده ای که در MongoDB وجود دارد و آنهم این است که: تا زمانی که داده ای در دیتابیسی ذخیره نشود، آن دیتابیس وجود ندارد. همچنین اگر به دیتابیس یا Collection ای (اگر با مفاهیم دیتابیس های NoSQL آشنا نیستید، پیشنهاد می کنم مقاله ی آشنایی با انواع دیتابیس های NoSQL را مطالعه کنید.) اشاره کنید، اگر مقدار مورد نظرتان وجود داشته باشد تغییر می کند، در غیر اینصورت آن مقدار جدید را می سازد.
نمایش دیتابیس های موجود در در MongoDB
به عنوان اولین دستور به MongoDB ازش میخواییم تمام دیتابیس های موجود روی خودش رو بهمون نشون بده. این کار رو با دستور زیر انجام می دهیم و نتیجه ی اجرای دستور را هم مشاهده می کنید:
show dbs
دستور show dbs
، لیست تمامی دیتابیس هایی که هم اکنون وجود دارند را نمایش می دهد. همانطور که می بینید، دیتابیسی به نام test اصلا وجود ندارد.
ساخت دیتابیس جدید در MongoDB
برای اینکه یک دیتابیس جدید درست کنیم، یا از یک دیتابیسی که وجود دارد استفاده کنیم، از دستور use
استفاده خواهیم کرد. در ادامه دیتابیس جدیدی می سازیم که دستور و نتیجه ی اجرای آن را در زیر مشاهده می کنید:
use sokanacademy_database
همانطور که در تصویر بالا هم مشاهده می کنید، ما وارد دیتابیس sokanacademy_database
شده ایم. ولی همانطور که درباره ی دیتابیس test هم گفتم، با توجه به اینکه هیچ داده ای در آن ذخیره نکرده ایم، هنوز نمی توانیم این دیتابیس را در لیست دیتابیس های موجود ببینیم.
ذخیره (Insert) اطلاعات در MongoDB
با دستور زیر قصد داریم یک collection جدید با نام features
درست کنیم. و داخل آن یکی از امکانات سایت سکان آکادمی را ذخیره کنیم:
db.features.insertOne({name: "Sokan Plus"})
به دستوری که در بالا وارد شده است نگاهی دقیق تر بیاندازید. ما با استفاده از db توانستیم به دیتابیسی که داخلش هستیم دسترسی داشته باشیم. سپس، با استفاده از نقطه بخش collocation را مشخص کرده و دوباره با یک نقطه ی دیگر داخل آن collocation، تابع insertOne را فراخوانی کردیم و اطلاعاتی که می خواستیم در collocation مورد نظرمان از دیتابیسی که داخلش هستیم بریزیم را، به عنوان ورودی به تابع دادیم.
⭐توجه: زبان پرس و جو (Query) در MongoDB، جاوااسکریپت (JavaScript) است. در واقع MongoDB برپایه ی MozJS است که یکی از شاخه های SpiderMonkey می باشد. اگر دوست داشتید، می توانید سورس کد MongoDB را مشاهده کنید.
حالا بیایید ببینیم در دیتابیس ما چه Collocation هایی وجود دارد. برای این کار .db
را نوشته و دوبار tab بزنید:
دقیقا همانطور که با یک Object در جاوااسکریپت کار می کند، با دیتابیس ها و Collocation هاشون و توابع شون هم کار کنید.
دریافت لیست Collection ها در MongoDB
حالا بیاید لیست تمام Collocation هایمان را با دستور getCollectionNames
مشاهده کنیم. دستور و نتیجه ی حاصل از آن را در زیر ببینید:
db.getCollectionNames()
همانطور که می بینید، یک آرایه ای داریم که در آن collocation های مان لیست شده اند. حالا با همان روشی که بالاتر هم گفتم، می توانید روی آنها توابع مورد نظرتان را صدا بزنید و کارهای مورد نظرتان را انجام بدهید.
بعضی از دستور ها البته راه های میانبری هم دارند و برایشان دستورات ویژه ای درست شده است. مثلا درمورد دستور بالا می توانیم از show collections هم استفاده کنیم. که خروجی حاصل از این دستور، برای افراد غیر برنامه نویس، خواناتر است.
برای اینکه لیستی از توابع قابل اعمال روی collection تان را هم ببینید، می توانید با همان روش بالا، بعد از گذاشتن نقطه، دوبار tab بزنید:
بازخوانی اطلاعات در MongoDB
شما می تواندی اطلاعات ثبت شده در یک Collection را هم با استفاده از تابع ()find
مشاهده کنید. دستور و خروجی این تابع در زیر قابل مشاده است:
db.features.find()
ذخیره ی یک دسته اطلاعات (Insert Many) در MongoDB
حالا می خواهیم با یک دستور، تعدادی داده وارد collection مان کنیم:
db.features.insertMany([{name:"Sokan Blog"} , {name: "Radio Fullstack"} , {name:"Sokan Glossary"}])
برای اینکار از تابع ()insertMany استفاده کردم که نتیجه ی آن را در تصویر زیر می بینید:
چند نکته در نتیجه ی دستور بالا قابل توجه است:
- تابع ()insertMany یک آرایه ای از element ها را به عنوان ورودی دریافت می کند. نه صرفا یک سری element.
- برای MongoDB اهمیتی ندارد که بین کلید ها و مقدارهایشان یا بین براکت و مقداری که در آن هست فاصله ای باشد یا نباشد.
- همانطور که اشاره شد، ساختار نوشتن دستورات در MongoDB بسیار شبیه به ساختار نوشتن کدها در JavaScript است. در نتیجه فرقی ندارد که ما از "" یا ‘’ یا `` استفاده کنیم.
حالا که به دو روش داده هایی را در MongoDB ریختیم، بیایید دوتا از آنها را بخوانیم (فعلا برامون فرقی نمی کند، کدام دوتا):
db.features.find().limit(2)
از تابع ()limit استفاده کردیم تا محدودیتی برای تعداد خروجی های دستور ()find داشته باشیم. برای اینکه ببنید چه کارهای دیگری می توانیم در زیر مجموعه ی find انجام دهید، از همان روشی که بالاتر گفته شد استفاده کنید و بعد از ()find نقطه بذارید و دوبار tab بزنید.
هر تابعی، توابعی برای خودش دارد و شما برای اینکه به نتیجه ی مطلوب تان برسید، می توانید این توابع را یکی بعد از دیگری با کمک نقطه، به هم بچسبانید.
مرتب سازی لیست خروجی از تابع find در MongoDB
در زیر تابع ()sort را روی زیرمجموعه ی تابع ()find صدا می زنیم، تا یکبار به صورت نزولی (descending) و یک بار هم به صورت صعودی (ascending) لیست خروجی را مرتب کند.
صعودی:
db.features.find().sort({name: 1})
نزولی
db.features.find().sort({name: -1})
به روز رسانی (Update) اطلاعات در MongoDB
می خواهم به شما مرتب کردن اطلاعات خروجی، براساس چند فیلد را هم نمایش بدهم. ولی ابتدا باید فیلد دیگری را به این مقادیر اضافه کنیم. برای همین موضوع از دو دستور ()updateOne
و ()updateMany
استفاده می کنیم تا تعداد محتواهای داخل هرکدام از این امکانات را به collectionشان اضافه کنیم.
دستور اضافه کردن مجموع محتواهای برای Sokan Blog:
db.features.updateOne({name: "Sokan Blog"} , {$set: {totalCount : 2636}})
دستور اضافه کردن مجموع محتوا برای بقیه ی اطلاعات به غیر از Sokan Blog:
db.features.updateMany({name:{$ne: "Sokan Blog"}} , {$set:{totalCount: 1547}})
نتیجه:
در دستورهای بالا از مقدارهای جدیدی استفاده کرده بودم که قبل تر، درموردشان توضیح نداده بودم. نگران نباشید، در ادامه توضیح می دهم.
در دستور بالا از دو مقدار استفاده کردم که یکی set$
و دیگری ne$
بود. در این مرحله همین قدر توضیح می دهم که set$
را برای اضافه کردن و یا تغییر اطلاعات به یک مقدار قبلی استفاده می کنیم و ne$
هم معادل Not Equal یا غیر مساوی است. در ادامه بخشی برای معرفی همین مقدارهای قدرتمند و کار راه انداز داریم.
حالا که فیلد جدیدی هم اضافه شد، بیایید براساس دو مقدار، تابع مرتب سازی را صدا بزنیم:
db.features.find().sort({name:1 , totalCount: -1})
فیلتر کردن لیست خروجی find
MongoDB این اجازه را می دهد که لیست خروجی از نتیجه ی کار تابع find را فیلتر کنیم و فیلدهایی را از لیست خروجی حذف کنیم یا فقط فیلدهای خاصی را نمایش بدهیم. برای این کار باید به تابع find ورودی مناسب را بدهید.
db.features.find({},{name: 1 , _id: 0})
در دستور بالا من با استفاده از {}
خواسته ام که همه ی رکوردهای ثبت شده را بازگرداند و با دومین ورودی تابع ()find
هم لیست خروجی را فیلتر کرده ام. من می توانستم با ورودی اول تابع، محدودیتی هم روی یافتن رکوردها اعمال کنم.
نوشتن کوئری های پیچیده تر
بعضی مقدارهای در MongoDB وجود دارد که می توانیم با استفاده از آنها، کوئری های پیچیده تری را بنویسیم. برخی از محبوب ترین های آنها، عبارتند از:
gt: مقادیری که بزرگتر از مقدار خاصی هستند.
lt: مقادیری که کوچکتر از مقدار خاصی هستند.
gte و lte: مقادیری که بزرگتر یا مساوی و کوچکتر یا مساوی با مقدار خاصی هستند.
eq: مقادیری که مساوی با مقدار خاصی هستند.
ne: مقادیری که نامساوی با مقدار خاصی هستند.
in: مقدار مورد نظر در یک مجموعه ی خاص باشد.
nin: مقدار مورد نظر در آن مجموعه ی خاص نباشد.
or: یا
and: و
exists: مقدار خاصی وجود دارد.
set: تغییر یا اضافه کردن مقدار خاصی به رکوردها.
به عنوان مثال به دستور زیر نگاه کنید:
db.features.find({totalCount: {$gt:1600}})
db.features.find({name: {$in:['Sokan Blog' , 'Sokan Glossary']}})
این عملگرها، تقریبا می توانند با همه ی دستورات در MongoDB ترکیب بشوند تا کوئری های پیچیده تر و مفیدتری را ایجاد کنند.
حذف (Delete) رکورد در MongoDB
برای حذف رکورد از collection های موجود در MongoDB، می توانیم از دستور deleteOne
و deleteMany
استفاده کنیم.
db.features.deleteOne({name: "Sokan Glossary"})
جایگزینی یک رکورد با رکوردی دیگر در MongoDB
برای اینکه در MongoDB مقداری را، جایگزین مقداری دیگر بکنید، می توانید از دستور ()replaceOne و ()replaceMany استفاده کنید. در زیر می توانید نحوه ی نوشتن این تابع را مشاهده کنید.
db.features.replaceOne({name: "Sokan Blog"} , {name: "Sokan Academy"})
شما تمام چیزی که برای کارکردن با MongoDB در سطح مبتدی و متوسط لازم دارید را یادگرفتید. پیشنهاد می کنم در همین نقطه کار را رها نکنید و ابتدا یک دیتابیس دیگر برای خودتان بسازید و با دستوراتی که یادگرفتید کمی کار کنید تا یادگیری عمیق تری داشته باشید. بعد از آن در صورتی که تمایل داشتید درباره ی MongoDB بیشتر بدانید به مستند رسمی همین دیتابیس و یا مطالب آموزشی حرفه ای تر مراجعه کنید.