جواد جهانگیری
جواد جهانگیری
خواندن ۹ دقیقه·۳ سال پیش

آموزش MongoDBCompass در مونگودبی

آموزش MongoDBCompass در مونگودبی
آموزش MongoDBCompass در مونگودبی


به نام آن که جان را فکرت آموخت / چراغ دل به نور جان برافروخت

در این مقاله از سری مقاله های آموزشی مونگودبی به آموزش قطب نما (MongoDBCompass) بصورت کاربردی و پروژه محور پرداخته می شود.MongoDBCompass یک ابزار رابط گرافیکی برای مدیریت پایگاه ها داده های مونگودبی می باشد . از طریق این ابزار می توان اکثر عملیات در مونگودبی همانند عملیات Curd , پشتیبان گیری و Import/Export داده ها بصورت گرافیکی بدون نوشتن دستی درخواست ها انجام داد.ایده این سری مقاله های آموزشی از این موضوع سرچشمه می گیرد که بخشی از خوانندگان وجود دارد که به محتوای نوشتاری آنلاین بهتر پاسخ می دهند و ترجیج می دهند مهارت های جدید را به سرعت از طریق خواندن افزایش دهند.این سری اموزش ها با ارایه اولین پکیج آموزشی در خصوص مانگودبی آغاز می شود که انتظار می رود با واکنش مثبت کاربران همراه شود.

توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل می‌شود!
تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا می‌کنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم. با کمال تشکر جواد جهانگیری
شماره تلفن همراه: 09149431772
نشانی پست الکترونیکی: javad.jahangiri.niopdc@gmail.com
فیلم‌های آموزشی در آپارات:جواد جهانگیری (CTO) - آپارات
فیلم آموزشی در یوتویب: javad jahangiri - YouTube
نسخه مقاله: ۱.۱ - تاریخ بروزرسانی: 1400/09/09


قطب نمای مونگودبی (MongoDBCompas) چیست؟

MongoDB Compass یک GUI قدرتمند برای پرس و جو ، تجمیع و تجزیه و تحلیل داده های MongoDB شما در یک محیط بصری است. استفاده از قطب نما رایگان است و منبع آن در دسترس است و می تواند در macOS ، Windows و Linux اجرا شود

چه کارهای با MongoDBCompas می تواند انجام داد؟

  • Visually Explore Your Data

برخی از وظایفی را که قطب نما می تواند به شما در انجام آنها کمک کند ، مانند وارد کردن و مدیریت داده ها از طریق رابط کاربری آسان ، کاوش کنید.

  • Connect to your deployment

به استقرار MongoDB که در اطلس MongoDB میزبانی شده است ، یا استقرار محلی در دستگاه خود متصل شوید.

  • Import your data

داده ها را از فایل های CSV یا JSON به پایگاه داده MongoDB خود وارد کنید.

  • Insert documents into your collections

اسناد را در نمای JSON بچسبانید ، یا اسناد را با استفاده از ویرایشگر فیلد به میدان وارد کنید.اسناد را به دو روش در JSON Mode و یک ویرایشگر Field-by-Field در مجموعه خود وارد کنید.

  • Query your data

برای فیلتر کردن داده های خود ، درخواستهای موقت بنویسید. روندها و اشتراکات موجود در مجموعه های خود را کاوش کنید.

  • Create aggregation pipelines

خطوط تجمیعی بنویسید که به اسناد یک مجموعه یا نمای اجازه می دهد از چندین مرحله عبور کنند و در آنجا به مجموعه ای از نتایج تجزیه و تحلیل شوند.

  • Work with your data in the MongoDB Shell

برای کنترل داده های خود در یک محیط جاوا اسکریپت تعاملی ، از MongoDB Shell در Compass استفاده کنید

نحوه نصب و راه اندازی قطب نمای مونگودبی (MongoDBCompas)

کاربران محترم سایت ویرگول نحوه نصب و راه اندازی MongoDBCompas بهمراه خود مونگودبی در مقاله آموزشی آموزش دیتابیس مونگودبی MongoDB Tutorial ارایه شده است که پیشنهاد می شود قبل از مطالعه این مقاله ,ابتدا مقاله مذکور مطالعه و MongoDBCompas نصب شود.

MongoDB Atlas

MongoDB Atlas یک پایگاه داده ابری کاملاً مدیریت شده است که توسط همان افرادی که MongoDB را ایجاد می کنند توسعه یافته است. اطلس تمام پیچیدگی استقرار ، مدیریت و بهبود استقرارهای شما را در ارائه دهنده خدمات ابری به دلخواه (AWS ، Azure و GCP) مدیریت می کند.

نحوه اتصال به مونگودبی از طریق MongoDBCompas

استارت سرویس مانگودبی
استارت سرویس مانگودبی

کاربران ویندوزی قبل از اتصال به مونگودبی توسط MongoDBCompas می بایستی از طریق سرویس ویندوز می بایستی سرویس مانگودبی را استارت نمایند زیرا این سرویس بصورت پیش فرض غیرفعال می باشد

از طریق گزینه start سرویس را فعال می کنیم

می توانید از طریق گزینه کانکت به سرویس local مونگودبی وصل شد و یا به سرویس ابری اطلس مونگودبی اتصال پیدا کرد در این اموزش ما به سرویس محلی مونگودبی که روی سیستم عامل خودمان نصب است متصل می شویم در زیر یک نمونه کانکشن استرینگ برای اتصال قرارداده شده است.

mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false

بعد از وصل شدن به سرور محلی مونگودبی لیست دیتابیس های قابل دسترس به ما نمایش داده می شود.

نحوه ایجاد دیتابیس مونگودبی توسط MongoDBCompas

برای ایجاد دیتایس توسط قطب نمای مونگودبی بر روی گزینه سبز رنگ create database از منو بالا کلیک کنید

سپس نام دیتابیس و اولین کالکشن مورد نظر را وارد می کنیم

سپس از طریق مرورگر دیتابیس ,می توان مشاهده کرد که دیتابیس جدید با اولین کالکشن به مونگودبی اضافه گردید

نحوه مشاهده اطلاعات Host مونگودبی در MongoDBCompas

برای مشاهده اطلاعات مربوط به هاست مونگودبی و اطلاعات کلاستر مونگودبی و نسخه سرور نصب شده بر روی ماشین محلی خود می تواند بر روی گزینه local از اسلایدبار سمت چپ می شود این کار را براحتی انجام داد


نحوه مشاهده پرفورمانس مونگودبی توسط MongoDBCompas

برای مشاهده پرفورمانس مونگودبی و مانیتورکردن وضعیت سرور مانگودبی کافی است از تب های بالا بر روی گزینه performance کلیک می کنیدکه اطلاعاتی در میزان خواندن و نوشتن سرور،وضعیت شبکه و حافظه سرور و ... را به ما نمایش می دهد

پرفورمانس سرور مونگودبی
پرفورمانس سرور مونگودبی


نحوه نمایش کالکشن ها و داکیومنت های موجود در یک دیتابیس مونگودبی در MongoDBCompas

برای مشاهده اطلاعات کالکشن های یک دیتابیس و تعداد داکیومنت های موجود در هر کالکشن و میانگین سایر داکیومنت های کالکشن ، کل سایز داکیومنت ها و تعداد ایندکس کافی است بر روی اسم دیتابیس مورد نظر در صفحه اصلی کلیک کنید:

نحوه مرور داکیومنت های موجود در یک کالکشن ، یک دیتابیس مونگودبی توسط MongoDBCompas


برای این کار کافی است بر روی نام کالکشن مورد نظر کلیک کنیم و داکیومنت های موجود در کالکشن نمایش داده می شود

با کلیک داکیومنت مطابق شکل زیر نمایش داده می شود:

نحوه نمایش اطلاعات داکیومنت های موجود در یک کالکشن مونگودبی بصورت json در MongoDBCompas

برای این کار بر روی گزینه {} مطابق شکل زیر کلیک می کنیم تا نمایی json از اطلاعات bjson داکیومنت های (رکوردهای ) یک کالکشن (جدول) را داشته باشید

نحوه نمایش جدولی داکیومنت های (رکوردها) موجود در یک کالکشن (جدول ) دیتابیس مونگودبی توسط ابزارMongoDBCompas

برای این کار بر روی گزینه نمایش جدولی مطابق شکل زیر کلیک می کنیدتا اطلاعات بصورت جدولی در سطر و ستون بصورت خلاصه نمایش داده شود:

نحوه ویرایش اطلاعات داکیومنت ها (رکوردها) موجود در یک کالکشن (جدول ) دیتابیس مونگودبی توسط ابزار MongoDBCompas

برای این کار بر روی اطلاعات نمایش داده کلیک می کنید اطلاعات را ویرایش و در نهایت بری روی گزینه update کلیک می گردد:

نحوه درج اطلاعات توسط ابزار MongoDBCompas در مونگودبی

برای درج اطلاعات بر روی گزینه ADD DATA کلیک می کنید و سپس بر روی گزینه Insert Document کلیک نمایید:

سپس با استفاده از فرمت json داکیومنت جدید (رکوردجدید ) را وارد کرده و سپس گزینه insert را کلیک می نمایید:

و رکورد جدید بصورت زیر اضافه شده و یک شناسه _id به ان اختصاص داده می شود

نکته:
توجه شود می توانید در هنگام درج کردن اطلاعات از طریق ابزارهای MongoDBCompas می توانید براحتی بدون فرمت json نیز مطابق شکل زیر اطلاعات را وارد کنید:


برای مثال بر روی گزینه Add Field After کلیک می کنید و به ترتیب اطلاعات فیلدهای مورد نظر در یک کادر محاوره ای بصورت ریکتیو وارد می کنید

نحوه export کردن اطلاعات یک کالکشن (جدول ) در مونگودبی توسط ابزار MongoDBCompas

برای این کار بر روی گزینه Export Collection مطابق شکل زیر کلیک می نمایید:

سپس یا از طریق دستورات مونگودبی که در مقاله (آموزش مونگودبی) اموزش داده شده است اطلاعات را فیلتر می کنید و یا کل کالکشن را انتخاب می کنید:

سپس در مرحله بعدی فیلدهای موردنظر خود برای اکسپورت اطلاعات را انتخاب می کنید:

و در مرحله اخر فرمت اکسپورت داده ها که می تواند Json و یا Csv باشد را انتخاب می کنیم و یک نام به فایل مورد نظر میدهید و بر روی گزینه export کلیک می گردد:

فایل خروجی برای ما ایجاد می شود

نحوه import کردن اطلاعات در مونگودبی توسط ابزار MongoDBCompas

برای ایمورت کردن داده ها ابتدا بر روی گزینه ADD DATA کلیک می کنید و سپس بر روی گزینه Import File کلیک می نمایید:

سپس فایل و فرمت فایل مورد نظر برای ایمپورت اطلاعات را انتخاب می گردد و سپس بر روی گزینه import کلیک می کنید که عملیات ایمپورت اطلاعات شروع شود.

https://www.aparat.com/javadjahangiriniopdc/playlists



نحوه نوشتن پرس و جو (ًQuery) در مونگودبی توسط ابزار MongoDBCompas

یک دیتابیس بنام بلاگ(blog) با یک کالکشن (جدول) post ایجاد کنید:

برای درج اطلاعات از گزینه ADD DATA و گزینه Insert Document استفاده می شود:

[ { &quot_id&quot: {&quot$oid&quot: &quot616ff6717ee16fa4c6b59ee2&quot }, &quottitle&quot: &quotMongoDB Overview&quot, &quotdescription&quot: &quotMongoDB is no SQL database&quot, &quotby&quot: &quottutorials point&quot, &quoturl&quot: &quothttp://www.tutorialspoint.com&quot, &quottags&quot: [&quotmongodb&quot, &quotdatabase&quot, &quotNoSQL&quot], &quotlikes&quot: 100 }, { &quot_id&quot: {&quot$oid&quot: &quot616ff6717ee16fa4c6b59ee3&quot}, &quottitle&quot: &quotNoSQL Database&quot, &quotdescription&quot: &quotNoSQL database doesn't have tables&quot, &quotby&quot: &quottutorials point&quot, &quoturl&quot: &quothttp://www.tutorialspoint.com&quot, &quottags&quot: [&quotmongodb&quot, &quotdatabase&quot, &quotNoSQL&quot], &quotlikes&quot: 20, &quotcomments&quot: [ { &quotuser&quot:&quotuser1&quot, &quotmessage&quot: &quotMy first comment&quot, &quotdateCreated&quot: &quot2013-12-09T23:05:00Z&quot, &quotlike&quot: 0 } ] } ]

مطابق شکل زیر کد درج در این قسمت کپی می کنید و گزینه INSERT را کلیک نمایید:

نکته
دقت شود در هنگام درج اطلاعات در ابزار MongoDBCompas می بایستی نام فیلدها بین دابل کوتیشن باشد و همچنین تاریخ هم بصورت تاریخ پیوسته وارد شد.

مثال اول : اطلاعات رکوردی را که عنوان برابر با MongoDB Overview می باشد را فیلتر کنید:

مثال دوم: رکوردهای که تعداد like های بیشتر یا مساوی 20 مورد باشد را جستجو کنید:

برای حل این مثال ابتدا بایستی به جدول اپراتورهای مقایسه ای زیر دقت شود برای بیشتر یا مساوی می بایستی از اپراتور gte$ استفاده شود:

اپراتورهای مقایسه ای در مونگودبی
اپراتورهای مقایسه ای در مونگودبی

سپس به شکل ذیل کد مربوطه در قسمت find وارد کنید و بر گزینه find کلیک نمایید:

{likes:{$gte:20}}


مثال سوم:پرس جوی در مونگودبی بنویسید که رکوردهای که عنوان ان شامل "NoSQL Database","MongoDB Overview" باشد را نمایش دهد

{title:{$in:[&quotNoSQL Database&quot,&quotMongoDB Overview&quot]}}

مثال چهارم:پرس جوی در مونگودبی بنویسید که رکوردهای که عنوان ان MongoDB Overview و تعداد like ان از 20 بیشتر باشد را نمایش دهد:

برای نوشتن این پرس و جوی می بایستی به اپراتورهای منطقی زیر توجه شود:

اپراتورهای منطقی در مونگودبی
اپراتورهای منطقی در مونگودبی


{$and:[{title:&quotMongoDB Overview&quot},{likes:{$gte:20}}]}
نکته در مورد and کردن در مونگودبی می توانید از طریق جداکننده کاما (,) بین اپراتورها نیز استفاده کرد
{title:"MongoDB Overview",likes:{$gte:20}}

مثال پنجم: پرس و جوی را در مونگودبی بنویسید که رکوردهای که دارای کامنت باشد را به ما نمایش دهد:

شکل کلی استفاده از اپراتور exists$ به شرح ذیل می باشد:

{ field: { $exists: <boolean> } }

پاسخ:

{comments:{$exists:true}}


مثال ششم:پرس و جوی در مونگودبی بنویسید که فیلدهای عنوان (title ) و توضیحات (description) برای رکوردهای بیشتر از 20 تا like را نمایش دهد:

نکته:فیلد _id نمایش داده می شود اگر می خواهید نمایش داده شود کافی است id:0 قرار دهید


مثال هفتم:پرس و جوی بنویسید که اطلاعات مثال ششم بصورت صعودی براساس title بصورت صعودی نمایش دهد:

مثال هشتم : پرس و جوی را بنویسید که تمامی رکوردهای که فیلد tags آن برابر سه مقدار "mongodb", "database","NoSQL" باشد را نمایش دهد:

دقت شود برای زدن پرس و جو بر روی مقادیر آرایه (Array) از علامت براکت باز و بسته [ ] استفاده می شود فقط در این حالت رکورد ها که دقیقا tags شامل سه مورد یاد شده نمایش داده می شود:

{ tags: [&quotmongodb&quot, &quotdatabase&quot,&quotNoSQL&quot] }

اگر گفته شود فقط یک مقدار آرایه ای شامل یک مقدار باشد در این صورت نیازی به استفاده از براکت نمی باشد:

{ tags:&quotmongodb&quot}
نکته:
اگر گفته شود که یک مقدار آرایه ای شامل موردهای "mongodb" و "database" باشد در اینصورت می بایستی از اپراتور all$ بهمراه براکت استفاده می شود:
{ tags:{$all:[&quotmongodb&quot,&quotdatabase&quot]}}

مثال نهم: پرس و جوی در مونگودبی بنویسید که رکوردهای که تعداد tagsهای برابر 3 می باشد را نمایش دهد.

همانطور که در مثال یاد شده آمده است tags از نوع آرایه می باشد و برای فیلتر کردن سایز آرایه می توانید از size$ استفاده می شود

{ tags:{$size:3}}

آموزش aggregation pipeline در مونگو دی بی

ابتدا وارد دیتابیس 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 درج می شود:

مثال دهم:پرس و جو بنویسید که رکوردهای که عنوان انها 'title_0' باشد بر اساس فیلد by دسته بندی نمایید به نحوه که مشخص شود مجموع likes هر دسته چه تعداد می باشد:

عملیات های خلاصه سازی در تمامی دیتابیس های مهم می باشد برای مثال دستور 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 شود و نتیجه نهایی به دو رکورد محدود شود برای این کار مطابق شکل زیر عمل می شود:

نحوه lookup در mongodb برای join زدن بین collectionها

همونطور که مستحضرید دیتابیس 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 &quotfrom&quot collection>, as: <output array field> } }


from : نام اون collection در database فعلی که قصد داریم با اون join بزنیم رو در اینجا مشخص میکنیم.

  • localField : نام فیلد در collection فعلی
  • foreignField : نام فیلد در collection مقصد. عملگر lookup در mongodb این دو فیلد localField و foreignField رو با هم بررسی میکنه و document هایی که برابر هستند رو انتخاب میکنه و در اختیار ما قرار میده.
  • as : با استفاده از این مورد نام فیلد جدیدی که به collection فعلی اضافه میشه و آرایه‌ای از نتایج در اون قرار میگیره رو مشخص میکنیم.

اگر قصد داشتیم در 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 از سندهای ذیل برای درج استفاده کنید:

[{ &quot_id&quot: { &quot$oid&quot: &quot6172597c1b0c3f4c18445746&quot }, &quotcustomer&quot: { &quot_id&quot: &quot2&quot, &quotname&quot: &quotamin&quot, &quotfamily&quot: &quotjahangiri&quot }, &quotproducts&quot: [ { &quotname&quot: &quotpen&quot, &quotprice&quot: &quot100&quot, &quotquantity&quot: &quot2&quot, &quotpriceall&quot: &quot200&quot, &quotDateAt&quot: { &quot$date&quot: &quot2021-10-21T20:30:00Z&quot } }, { &quotname&quot: &quotbook&quot, &quotprice&quot: &quot200&quot, &quotquantity&quot: &quot2&quot, &quotpriceall&quot: &quot400&quot, &quotDateAt&quot: { &quot$date&quot: &quot2021-09-21T20:30:00Z&quot } }, { &quotname&quot: &quottable&quot, &quotprice&quot: &quot200&quot, &quotquantity&quot: &quot2&quot, &quotpriceall&quot: &quot400&quot, &quotDateAt&quot: { &quot$date&quot: &quot2021-09-21T20:30:00Z&quot } } ] },{ &quot_id&quot: { &quot$oid&quot: &quot6172597c1b0c3f4c18445745&quot }, &quotcustomer&quot: { &quot_id&quot: &quot1&quot, &quotname&quot: &quotjavad&quot, &quotfamily&quot: &quotjahangiri&quot }, &quotproducts&quot: [ { &quotname&quot: &quotpen&quot, &quotprice&quot: &quot100&quot, &quotquantity&quot: &quot2&quot, &quotpriceall&quot: &quot200&quot, &quotDateAt&quot: { &quot$date&quot: &quot2021-10-21T20:30:00Z&quot } }, { &quotname&quot: &quottable&quot, &quotprice&quot: &quot300&quot, &quotquantity&quot: &quot2&quot, &quotpriceall&quot: &quot600&quot, &quotDateAt&quot: { &quot$date&quot: &quot2021-09-21T20:30:00Z&quot } } ] }]

برای درج سند در کالکشن inventory نیز از اطلاعات ذیل استفاده کنید:

[{ &quot_id&quot: { &quot$oid&quot: &quot617270bbfded3202514607b6&quot }, &quotproduct&quot: &quotbook&quot, &quotdescription&quot: &quotbook products&quot, &quotquantity&quot: 30 },{ &quot_id&quot: { &quot$oid&quot: &quot617270bbfded3202514607b7&quot }, &quotproduct&quot: &quotpen&quot, &quotdescription&quot: &quotpen products&quot, &quotquantity&quot: 20 },{ &quot_id&quot: { &quot$oid&quot: &quot617270bbfded3202514607b8&quot }, &quotproduct&quot: &quottable&quot, &quotdescription&quot: &quottable products&quot, &quotquantity&quot: 10 }]

حال ما یک کالکشن سفارشات (جدول سفارشات ) داریم که حاوی اطلاعات مشتری که خرید را انجام داده بهمراه اطلاعات محصولات خریداری شده به ریز را شامل می شود و یک کالکشن فهرست اموال داریم که شامل تعداد موجودی این کالا در انبار می باشد حال می خواهیم بین این دو کالکشن یک join ایجاد کنیم:

  • برای این کار ابتدا به کالکشن OrderApp بروید و بعنوان کالکشن مبدا انتخاب شود
  • سپس به قسمت Aggregations بروید و یک استیج از نوع lookup$ را انتخاب کیند
  • سپس مطابق کد زیر کالکشن مقصد روی inventory و فیلد محلی را از کالکشن مبدا که در این مثال سفارشات می باشد را بر روی products.name و فیلد خارجی از کالکشن مقصد را برروی product قرار میدهیم و برای فیلد جدید inventory_product را نام گذاری می کنید
{ from: 'inventory', localField: 'products.name', foreignField: 'product', as: 'inventory_product' }
نکته: دقت شود در این مثال کالکشن سفارشات شامل یک فیلد بعنوان Products می باشد که ارایه از کالاهای خریداری شده که شامل نام ،مبلغ ، تعداد ، قیمت ,قیمت کل و تاریخ سفارش را شامل می باشد لذا برای دسترسی بعنوان محصولات می بایستی بصورت products.name در استیج lookup$ انتخاب شود

استفاده از شروط پیچیده در 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 مانند قبل هستند. ویژگی‌های دیگر بصورت زیر تعریف میشن:

  • ویژگی let: چون در pipeline به فیلدهای کالکشن مقصد دسترسی نداریم لذا برای ایجاد join که از طریق دستور $and در pipeline ایجاد می شود برای دسترسی به متغییرهای کالکشن مقصد ابتدا باید در قسمت let تعریف شود ,به متغییر های کالکشن مبدا در pipeline دسترسی دارید
  • ویژگی pipeline: با استفاده این ویژگی می توانید بین کالکشن ها join ایجاد کرده و فیلترهای مقتضی را اعمال و فیلدهای مورد نظر خود را انتخاب کنید.

اگر بخواهیم در 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 نیاز دارید:

  • کالکشن (جدول) سفارشات را بعنوان کالکشن مبدا انتخاب می کنید و به قسمت Aggregation رفته و یک استیج از نوع lookup$ را انتخاب می کنید.
  • کالکشن (جدول) مقصد را از طریق فیلد from بر روی inventory می گذارید
  • در قسمت let چون در قسمت pipeline به فیلدهای کالکشن مقصد (inventory) دسترسی ندارید یک فیلد بنام products_inventory تعریف می نمایید و مقدار آن برابر فیلد product از کالکشن مقصد (inventory ) مقدار دهی می کنید ما برای ایجاد join بین کالکشن مبدا براساس products.name و در کالکشن مقصد براساس فیلد product به این متغییر نیاز خواهید داشت.
  • در قسمت pipeline ابتدا یک استیج از نوع match$ ایجاد می کنید سپس از طریق اپراتور and$ و اپراتوار eq$ بین دو فیلد inventory.product و orderApp.products.name را باهم برابر قرارداده و یک رابطه ایجاد می کنید
نکته : توجه شود چون ما در pipeline به فیلد inventory.product دسترسی ندارید از متغیر کمکی که در قسمت let که حاوی مقادیر همین فیلد است بنام products_inventory در pipeline استفاده می کنید فقط دقت شود برای دسترسی به متغییرهای که در let تعریف شده در قسمت pipeline از دو $$ استفاده می شود
{ from: 'inventory', as: 'inventory_product', let:{products_inventory:&quot$product&quot}, pipeline:[{ $match:{ $expr:{$and:[ {$eq:[&quot$product.name&quot,&quot$$products_inventory&quot]} ]} } }] }
https://www.aparat.com/javadjahangiriniopdc/playlists

با تشکر ازمطالعه این مقاله ،مثل همیشه کنجکاو باشید!!!

در دوره های آموزش تضمینی مجتمع فنی ارومیه که به صورت خصوصی و عمومی در دو شیوه حضوری و آنلاین برگزار می شود سرفصل های بسیار متنوع و کاربردی را بصورت پروژه محور آموزش داده می شود تا شخص کارآموز بتواند بلافاصله پس از اتمام این دوره در کمترین زمان ممکن وارد بازار کار شود.
آموزش تخصص ماست با ما حرفه ای شوید
جهت مشاوره با شماره 09149431772 در ارتباط باشید ...


آموزش MongoDBCompass در مونگودبیآموزش مونگودبیجواد جهانگیریمجتمع فنی ارومیهآموزش برنامه نویسی در ارومیه
بنده دارای مدارک بین المللی شبکه ,برنامه نویسی, سرورهای ویندوزی و لینوکس هستم بیش از ده سال سابقه تدریس در زمینه های یاد شده را دارم. آموزش تخصص ماست با ما حرفه ای شوید 09149431772 مجتمع فنی ارومیه
شاید از این پست‌ها خوشتان بیاید