در این مقاله از سری مقاله های آموزشی مونگودبی به آموزش قطب نما (MongoDBCompass) بصورت کاربردی و پروژه محور پرداخته می شود.MongoDBCompass یک ابزار رابط گرافیکی برای مدیریت پایگاه ها داده های مونگودبی می باشد . از طریق این ابزار می توان اکثر عملیات در مونگودبی همانند عملیات Curd , پشتیبان گیری و Import/Export داده ها بصورت گرافیکی بدون نوشتن دستی درخواست ها انجام داد.ایده این سری مقاله های آموزشی از این موضوع سرچشمه می گیرد که بخشی از خوانندگان وجود دارد که به محتوای نوشتاری آنلاین بهتر پاسخ می دهند و ترجیج می دهند مهارت های جدید را به سرعت از طریق خواندن افزایش دهند.این سری اموزش ها با ارایه اولین پکیج آموزشی در خصوص مانگودبی آغاز می شود که انتظار می رود با واکنش مثبت کاربران همراه شود.
توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل میشود!
تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا میکنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم. با کمال تشکر جواد جهانگیری
شماره تلفن همراه: 09149431772
نشانی پست الکترونیکی: javad.jahangiri.niopdc@gmail.com
فیلمهای آموزشی در آپارات:جواد جهانگیری (CTO) - آپارات
فیلم آموزشی در یوتویب: javad jahangiri - YouTube
نسخه مقاله: ۱.۱ - تاریخ بروزرسانی: 1400/09/09
MongoDB Compass یک GUI قدرتمند برای پرس و جو ، تجمیع و تجزیه و تحلیل داده های MongoDB شما در یک محیط بصری است. استفاده از قطب نما رایگان است و منبع آن در دسترس است و می تواند در macOS ، Windows و Linux اجرا شود
برخی از وظایفی را که قطب نما می تواند به شما در انجام آنها کمک کند ، مانند وارد کردن و مدیریت داده ها از طریق رابط کاربری آسان ، کاوش کنید.
به استقرار MongoDB که در اطلس MongoDB میزبانی شده است ، یا استقرار محلی در دستگاه خود متصل شوید.
داده ها را از فایل های CSV یا JSON به پایگاه داده MongoDB خود وارد کنید.
اسناد را در نمای JSON بچسبانید ، یا اسناد را با استفاده از ویرایشگر فیلد به میدان وارد کنید.اسناد را به دو روش در JSON Mode و یک ویرایشگر Field-by-Field در مجموعه خود وارد کنید.
برای فیلتر کردن داده های خود ، درخواستهای موقت بنویسید. روندها و اشتراکات موجود در مجموعه های خود را کاوش کنید.
خطوط تجمیعی بنویسید که به اسناد یک مجموعه یا نمای اجازه می دهد از چندین مرحله عبور کنند و در آنجا به مجموعه ای از نتایج تجزیه و تحلیل شوند.
برای کنترل داده های خود در یک محیط جاوا اسکریپت تعاملی ، از MongoDB Shell در Compass استفاده کنید
کاربران محترم سایت ویرگول نحوه نصب و راه اندازی MongoDBCompas بهمراه خود مونگودبی در مقاله آموزشی آموزش دیتابیس مونگودبی MongoDB Tutorial ارایه شده است که پیشنهاد می شود قبل از مطالعه این مقاله ,ابتدا مقاله مذکور مطالعه و MongoDBCompas نصب شود.
MongoDB Atlas یک پایگاه داده ابری کاملاً مدیریت شده است که توسط همان افرادی که MongoDB را ایجاد می کنند توسعه یافته است. اطلس تمام پیچیدگی استقرار ، مدیریت و بهبود استقرارهای شما را در ارائه دهنده خدمات ابری به دلخواه (AWS ، Azure و GCP) مدیریت می کند.
کاربران ویندوزی قبل از اتصال به مونگودبی توسط MongoDBCompas می بایستی از طریق سرویس ویندوز می بایستی سرویس مانگودبی را استارت نمایند زیرا این سرویس بصورت پیش فرض غیرفعال می باشد
از طریق گزینه start سرویس را فعال می کنیم
می توانید از طریق گزینه کانکت به سرویس local مونگودبی وصل شد و یا به سرویس ابری اطلس مونگودبی اتصال پیدا کرد در این اموزش ما به سرویس محلی مونگودبی که روی سیستم عامل خودمان نصب است متصل می شویم در زیر یک نمونه کانکشن استرینگ برای اتصال قرارداده شده است.
mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false
بعد از وصل شدن به سرور محلی مونگودبی لیست دیتابیس های قابل دسترس به ما نمایش داده می شود.
برای ایجاد دیتایس توسط قطب نمای مونگودبی بر روی گزینه سبز رنگ create database از منو بالا کلیک کنید
سپس نام دیتابیس و اولین کالکشن مورد نظر را وارد می کنیم
سپس از طریق مرورگر دیتابیس ,می توان مشاهده کرد که دیتابیس جدید با اولین کالکشن به مونگودبی اضافه گردید
برای مشاهده اطلاعات مربوط به هاست مونگودبی و اطلاعات کلاستر مونگودبی و نسخه سرور نصب شده بر روی ماشین محلی خود می تواند بر روی گزینه local از اسلایدبار سمت چپ می شود این کار را براحتی انجام داد
برای مشاهده پرفورمانس مونگودبی و مانیتورکردن وضعیت سرور مانگودبی کافی است از تب های بالا بر روی گزینه performance کلیک می کنیدکه اطلاعاتی در میزان خواندن و نوشتن سرور،وضعیت شبکه و حافظه سرور و ... را به ما نمایش می دهد
برای مشاهده اطلاعات کالکشن های یک دیتابیس و تعداد داکیومنت های موجود در هر کالکشن و میانگین سایر داکیومنت های کالکشن ، کل سایز داکیومنت ها و تعداد ایندکس کافی است بر روی اسم دیتابیس مورد نظر در صفحه اصلی کلیک کنید:
برای این کار کافی است بر روی نام کالکشن مورد نظر کلیک کنیم و داکیومنت های موجود در کالکشن نمایش داده می شود
با کلیک داکیومنت مطابق شکل زیر نمایش داده می شود:
برای این کار بر روی گزینه {} مطابق شکل زیر کلیک می کنیم تا نمایی json از اطلاعات bjson داکیومنت های (رکوردهای ) یک کالکشن (جدول) را داشته باشید
برای این کار بر روی گزینه نمایش جدولی مطابق شکل زیر کلیک می کنیدتا اطلاعات بصورت جدولی در سطر و ستون بصورت خلاصه نمایش داده شود:
برای این کار بر روی اطلاعات نمایش داده کلیک می کنید اطلاعات را ویرایش و در نهایت بری روی گزینه update کلیک می گردد:
برای درج اطلاعات بر روی گزینه ADD DATA کلیک می کنید و سپس بر روی گزینه Insert Document کلیک نمایید:
سپس با استفاده از فرمت json داکیومنت جدید (رکوردجدید ) را وارد کرده و سپس گزینه insert را کلیک می نمایید:
و رکورد جدید بصورت زیر اضافه شده و یک شناسه _id به ان اختصاص داده می شود
نکته:
توجه شود می توانید در هنگام درج کردن اطلاعات از طریق ابزارهای MongoDBCompas می توانید براحتی بدون فرمت json نیز مطابق شکل زیر اطلاعات را وارد کنید:
برای مثال بر روی گزینه Add Field After کلیک می کنید و به ترتیب اطلاعات فیلدهای مورد نظر در یک کادر محاوره ای بصورت ریکتیو وارد می کنید
برای این کار بر روی گزینه Export Collection مطابق شکل زیر کلیک می نمایید:
سپس یا از طریق دستورات مونگودبی که در مقاله (آموزش مونگودبی) اموزش داده شده است اطلاعات را فیلتر می کنید و یا کل کالکشن را انتخاب می کنید:
سپس در مرحله بعدی فیلدهای موردنظر خود برای اکسپورت اطلاعات را انتخاب می کنید:
و در مرحله اخر فرمت اکسپورت داده ها که می تواند Json و یا Csv باشد را انتخاب می کنیم و یک نام به فایل مورد نظر میدهید و بر روی گزینه export کلیک می گردد:
فایل خروجی برای ما ایجاد می شود
برای ایمورت کردن داده ها ابتدا بر روی گزینه ADD DATA کلیک می کنید و سپس بر روی گزینه Import File کلیک می نمایید:
سپس فایل و فرمت فایل مورد نظر برای ایمپورت اطلاعات را انتخاب می گردد و سپس بر روی گزینه import کلیک می کنید که عملیات ایمپورت اطلاعات شروع شود.
یک دیتابیس بنام بلاگ(blog) با یک کالکشن (جدول) post ایجاد کنید:
برای درج اطلاعات از گزینه ADD DATA و گزینه Insert Document استفاده می شود:
[ { "_id": {"$oid": "616ff6717ee16fa4c6b59ee2" }, "title": "MongoDB Overview", "description": "MongoDB is no SQL database", "by": "tutorials point", "url": "http://www.tutorialspoint.com", "tags": ["mongodb", "database", "NoSQL"], "likes": 100 }, { "_id": {"$oid": "616ff6717ee16fa4c6b59ee3"}, "title": "NoSQL Database", "description": "NoSQL database doesn't have tables", "by": "tutorials point", "url": "http://www.tutorialspoint.com", "tags": ["mongodb", "database", "NoSQL"], "likes": 20, "comments": [ { "user":"user1", "message": "My first comment", "dateCreated": "2013-12-09T23:05:00Z", "like": 0 } ] } ]
مطابق شکل زیر کد درج در این قسمت کپی می کنید و گزینه INSERT را کلیک نمایید:
نکته
دقت شود در هنگام درج اطلاعات در ابزار MongoDBCompas می بایستی نام فیلدها بین دابل کوتیشن باشد و همچنین تاریخ هم بصورت تاریخ پیوسته وارد شد.
برای حل این مثال ابتدا بایستی به جدول اپراتورهای مقایسه ای زیر دقت شود برای بیشتر یا مساوی می بایستی از اپراتور gte$ استفاده شود:
سپس به شکل ذیل کد مربوطه در قسمت find وارد کنید و بر گزینه find کلیک نمایید:
{likes:{$gte:20}}
{title:{$in:["NoSQL Database","MongoDB Overview"]}}
برای نوشتن این پرس و جوی می بایستی به اپراتورهای منطقی زیر توجه شود:
{$and:[{title:"MongoDB Overview"},{likes:{$gte:20}}]}
نکته در مورد and کردن در مونگودبی می توانید از طریق جداکننده کاما (,) بین اپراتورها نیز استفاده کرد
{title:"MongoDB Overview",likes:{$gte:20}}
شکل کلی استفاده از اپراتور exists$ به شرح ذیل می باشد:
{ field: { $exists: <boolean> } }
پاسخ:
{comments:{$exists:true}}
نکته:فیلد _id نمایش داده می شود اگر می خواهید نمایش داده شود کافی است id:0 قرار دهید
دقت شود برای زدن پرس و جو بر روی مقادیر آرایه (Array) از علامت براکت باز و بسته [ ] استفاده می شود فقط در این حالت رکورد ها که دقیقا tags شامل سه مورد یاد شده نمایش داده می شود:
{ tags: ["mongodb", "database","NoSQL"] }
اگر گفته شود فقط یک مقدار آرایه ای شامل یک مقدار باشد در این صورت نیازی به استفاده از براکت نمی باشد:
{ tags:"mongodb"}
نکته:
اگر گفته شود که یک مقدار آرایه ای شامل موردهای "mongodb" و "database" باشد در اینصورت می بایستی از اپراتور all$ بهمراه براکت استفاده می شود:
{ tags:{$all:["mongodb","database"]}}
همانطور که در مثال یاد شده آمده است tags از نوع آرایه می باشد و برای فیلتر کردن سایز آرایه می توانید از size$ استفاده می شود
{ tags:{$size:3}}
ابتدا وارد دیتابیس blog شوید و کالکشن post را که در مثال های قبلی ایجاد کرده بودید را پاک کنید
حالا از طریق کد زیر در حدود 1000 رکورد تصادفی در داخل کالکشن post ایجاد می کنید:
use blog
by=['tutorials point','w3schools','tutorialsteacher','udemy'] url=['http://www.tutorialspoint.com','http://www.w3schools.com','https://www.tutorialsteacher.com/','https://www.udemy.com'] for(i=0;i<1000;i++){ j=Math.round(Math.random()*3); db.post.insert({ '_id':i, 'title':'title_'+Math.round(Math.random()*3), 'description':'description_'+Math.round(Math.random()*3), 'by':by[j], 'url':url[j], 'likes':Math.round(Math.random()*3), }); }
تعداد 1000 رکورد با اطلاعات تصادفی در کالکشن post درج می شود:
عملیات های خلاصه سازی در تمامی دیتابیس های مهم می باشد برای مثال دستور groupby بهمراه having در دتیابیس های رابطه ای جز مهم ترین موضوعات می باشد و توابع Aggregation در SQL برای برگشت یک مقدار که از دسته بندی (گروه بندی) مقادیر مختلف دخیره شده در یک ستون ,استفاده می نمایید.
MongoDB از سه راه برای انجام Aggregration استفاده می کند: aggregation pipeline ، map-reduce function و متدهای single purpose aggregation
در این مثال تمرکز ما بر روش aggregation pipeline می باشد و سعی می کنیم با مثال های مختلف که ارایه می شود تسلط کافی برای دوستان در این راستا ایجاد شود
Aggregration مربوط به MongoDB بر اساس مفهوم data processing pipeline طراحی شده است. Aggregation pipeline مشابه UNIX world pipeline است. در مراحل اولیه یک collection داریم . این collection از طریق اسناد (document) ارسال می شود. این اسناد در طول خط لوله ها انتقال پیدا می کنند و در قالب stage هایی قرار می گیرند تا در نهایت، ما بتوانیم از آن ها یک نتیجه واحد بگیریم
همانطور که در شکل بالا می بینید که collection از stage های مختلفی عبور می کند که برخی از آن ها عبارتند از: $project, $match, $group, $sort. هر کدام از این stage ها می توانند چندین بار تکرار شوند.
stage های مختلف در pipeline (خط لوله) عبارتند از:
$project ، داده ها را انتخاب و فرم دهی می کند.
$match ، داده ها را فیلتر می کند.
$group داده ها را aggregrate می کند.
$sort داده ها را مرتب می کند.
$skipداده ها را skip می کند.
$limit داده ها را محدود می کند.
$unwind داده ها را نرمال سازی می کند.
ابتدا بر روی گزینه Aggregation از tab های بالای کلیک می کنیم به ترتیب ابتدا می بایستی یک استیج از نوع $match به پروژه اضافه کنیم و در ان براساس مثال title_0 فیلتر کنیم سپس یه استیج از نوع group$ به pipeline اضافه می کنیم که گروه بندی بر اساس فیلد by باشد و مجموع تعداد likes ها برای ما نمایش دهد
نکته: فیلدها در استیج ها با پیشوند $ مقدار دهی می شوند تا به این وسیله mongo shell درک کند که این فیلد جز فیلدهای اصلی سند می باشد
برای حل این مثال می بایستی قبل از استیج match$ از طریق استیج project$ فیلد عنوان را به حروف بزرگ تبدیل کنیم :
در فاز $project، ما می توانیم یک کلید اضافه کنیم، یک کلید حذف کنیم، یک کلید را باز سازی کنیم. همچنین توابع ساده ای نیز وجود دارند که ما می توانیم بر روی کلیدهایمان پیاده سازی کنیم:$toUpper, $toLower, $add, $multiply و غیره...
وارد tab مربوط به aggregation بشوید و از استیج project$ را انتخاب کنید و سپس برای این پروجکشن را اعمال کنیم فیلدهای که می خواهید انتخاب کنید چون به فیلد id نیازی نداریم ان را 0 می کینم برای title از طریق تابع $toUpper عنواین را به حروف بزرگ تبدیل می کنید,سپس با عنایت به اینکه در مرحله بعدی برای گروه بندی به فیلد by و برای محاسبه مجموع likes به فیلد لایک ها نیاز داریم این دوتا فیلد را نیز از طریق یک کرد مقدار انتخاب نمایید.
سپس بقیه مراحل دقیقا مثل مثال دهم می باشد فقط در استیج match$ چون عنواین به حروف بزرگ تبدیل شده است باید TITLE_0 با حروف بزرگ را وارد گردد:
حال فرض شود از ما خواسته می شود که نتیجه پرس و جو براساس فیلد By که دسته بندی براساس آن انجام شده است بصورت صعودی نمایش داده شود
اگر درخواست نتایج پرس و جو بصورت مرتب نزولی براساس فیلد مجموع لایک ها نمایش داده شود در اینصورت می بایستی براساس sumlikes مرتب شود
در نهایت فرض کنید درخواست شده که در نتیجه نهایی رکورد اول skip شود و نتیجه نهایی به دو رکورد محدود شود برای این کار مطابق شکل زیر عمل می شود:
همونطور که مستحضرید دیتابیس MongoDB یک پایگاهداده رابطهای مثل SQL نیست اما شما میتونین با استفاده از استیج lookup$،بین collectionها left outer join انجام بدین و پرس و جوهای مورد نظرتون رو ایجاد نمایید.
شکل دستوری استفاده از استیج lookup$ بصورت ذیل می باشد:
{ $lookup: { from: <collection to join>, localField: <field from the input documents>, foreignField: <field from the documents of the "from" collection>, as: <output array field> } }
from : نام اون collection در database فعلی که قصد داریم با اون join بزنیم رو در اینجا مشخص میکنیم.
اگر قصد داشتیم در SQL همچنین کاری رو انجام بدیم، بصورت زیر عمل میکردیم:
SELECT *, <output array field> FROM collection WHERE <output array field> IN (SELECT * FROM <collection to join> WHERE <foreignField>= <collection.localField>);
برای درک این موضوع یک دیتابیس جدید به نام store ایجاد می کنیم که دارای دو کالکشن بنام orderapp و inventory باشد و یکسری رکورد به شرح ذیل در آن درج می کنید:
برای کالکشن OrderApp از سندهای ذیل برای درج استفاده کنید:
[{ "_id": { "$oid": "6172597c1b0c3f4c18445746" }, "customer": { "_id": "2", "name": "amin", "family": "jahangiri" }, "products": [ { "name": "pen", "price": "100", "quantity": "2", "priceall": "200", "DateAt": { "$date": "2021-10-21T20:30:00Z" } }, { "name": "book", "price": "200", "quantity": "2", "priceall": "400", "DateAt": { "$date": "2021-09-21T20:30:00Z" } }, { "name": "table", "price": "200", "quantity": "2", "priceall": "400", "DateAt": { "$date": "2021-09-21T20:30:00Z" } } ] },{ "_id": { "$oid": "6172597c1b0c3f4c18445745" }, "customer": { "_id": "1", "name": "javad", "family": "jahangiri" }, "products": [ { "name": "pen", "price": "100", "quantity": "2", "priceall": "200", "DateAt": { "$date": "2021-10-21T20:30:00Z" } }, { "name": "table", "price": "300", "quantity": "2", "priceall": "600", "DateAt": { "$date": "2021-09-21T20:30:00Z" } } ] }]
برای درج سند در کالکشن inventory نیز از اطلاعات ذیل استفاده کنید:
[{ "_id": { "$oid": "617270bbfded3202514607b6" }, "product": "book", "description": "book products", "quantity": 30 },{ "_id": { "$oid": "617270bbfded3202514607b7" }, "product": "pen", "description": "pen products", "quantity": 20 },{ "_id": { "$oid": "617270bbfded3202514607b8" }, "product": "table", "description": "table products", "quantity": 10 }]
حال ما یک کالکشن سفارشات (جدول سفارشات ) داریم که حاوی اطلاعات مشتری که خرید را انجام داده بهمراه اطلاعات محصولات خریداری شده به ریز را شامل می شود و یک کالکشن فهرست اموال داریم که شامل تعداد موجودی این کالا در انبار می باشد حال می خواهیم بین این دو کالکشن یک join ایجاد کنیم:
{ from: 'inventory', localField: 'products.name', foreignField: 'product', as: 'inventory_product' }
نکته: دقت شود در این مثال کالکشن سفارشات شامل یک فیلد بعنوان Products می باشد که ارایه از کالاهای خریداری شده که شامل نام ،مبلغ ، تعداد ، قیمت ,قیمت کل و تاریخ سفارش را شامل می باشد لذا برای دسترسی بعنوان محصولات می بایستی بصورت products.name در استیج lookup$ انتخاب شود
از نسخه 3.6 به بعد pipeline اضافه شده است که میتونین با استفاده از اون پیشرفتهتر از lookup استفاده کنید. شما میتونین با استفاده از یک syntax دیگه از شروط پیچیدهتری در lookupها استفاده کنید و نتایج دقیقتری رو بدست بیارید. Syntax این مورد بصورت زیر هست:
{ $lookup: { from: <collection to join>, let: { <var_1>: <expression>, …, <var_n>: <expression> }, pipeline: [ <pipeline to execute on the collection to join> ], as: <output array field> } }
ویژگیهای from و as مانند قبل هستند. ویژگیهای دیگر بصورت زیر تعریف میشن:
اگر بخواهیم در SQL همچنین query رو بزنیم، بصورت زیر عمل میکنیم:
SELECT *, <output array field> FROM collection WHERE <output array field> IN (SELECT <documents as determined from the pipeline> FROM <collection to join> WHERE <pipeline> );
حالا می خواهیم مثال قبل را با استفاده از امکانات جدید مونگودبی باز نویسی کنیم و بین کالکشن سفارشات و کالکشن لیست اموال یک رابطه ایجاد کنید براساس Syntax جدید فقط به ویژگی های from,as,let,pipeline نیاز دارید:
نکته : توجه شود چون ما در pipeline به فیلد inventory.product دسترسی ندارید از متغیر کمکی که در قسمت let که حاوی مقادیر همین فیلد است بنام products_inventory در pipeline استفاده می کنید فقط دقت شود برای دسترسی به متغییرهای که در let تعریف شده در قسمت pipeline از دو $$ استفاده می شود
{ from: 'inventory', as: 'inventory_product', let:{products_inventory:"$product"}, pipeline:[{ $match:{ $expr:{$and:[ {$eq:["$product.name","$$products_inventory"]} ]} } }] }
در دوره های آموزش تضمینی مجتمع فنی ارومیه که به صورت خصوصی و عمومی در دو شیوه حضوری و آنلاین برگزار می شود سرفصل های بسیار متنوع و کاربردی را بصورت پروژه محور آموزش داده می شود تا شخص کارآموز بتواند بلافاصله پس از اتمام این دوره در کمترین زمان ممکن وارد بازار کار شود.
آموزش تخصص ماست با ما حرفه ای شوید
جهت مشاوره با شماره 09149431772 در ارتباط باشید ...