راهنمای مبتدی برای تجمع MongoDB (با ورزش)

  • 2021-07-11

هنگامی که شروع به کار با MongoDB می کنید ، به طور معمول از دستور FIND () برای طیف گسترده ای از نمایش داده ها استفاده خواهید کرد. با این حال ، به محض پیشرفت پرس و جوهای شما ، باید درباره تجمع MongoDB اطلاعات بیشتری کسب کنید.

در این مقاله ، من اصول اصلی ساخت نمایش داده های کل در MongoDB و نحوه استفاده از شاخص ها را برای سرعت بخشیدن به آنها توضیح خواهم داد.

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

تجمع در MongoDB چیست؟

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

یکی از متداول ترین موارد استفاده از تجمع ، محاسبه مقادیر کل برای گروه های اسناد است. این شبیه به جمع اصلی موجود در SQL با گروه بر اساس بند و عملکرد ، جمع و AVG است. تجمع MongoDB بیشتر پیش می رود و همچنین می تواند پیوندهای رابطه ای مانند ، اسناد تغییر شکل ، ایجاد مجموعه های جدید و به روزرسانی و غیره را انجام دهد.

در حالی که روش های دیگری برای به دست آوردن داده های کل در MongoDB وجود دارد ، چارچوب جمع آوری روش توصیه شده برای بیشتر کارها است.

مواردی وجود دارد که روشهای واحد با هدف مانند تخمین زده شده () ، شمارش () و مجزا () نامیده می شوند که به یک پرس و جو در یافتن () اضافه می شوند و آنها را سریع استفاده می کنند اما در دامنه محدود می شوند.

چارچوب MAP-LEADUCE در MongoDB سلف چارچوب جمع آوری و استفاده بسیار پیچیده تر است. mongoDB کاهش یافته است

خط لوله تجمع MongoDB چگونه کار می کند؟

در اینجا یک نمودار برای نشان دادن یک خط لوله تجمع MongoDB معمولی وجود دارد.

ورودی خط لوله می تواند یک مجموعه واحد باشد ، جایی که دیگران را می توان بعداً در پایین خط لوله ادغام کرد.

سپس خط لوله تا زمان دستیابی به هدف ما ، تحولات پی در پی روی داده ها را انجام می دهد.

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

این رویکرد به ما امکان می دهد تا با بررسی ورودی آن و خروجی ، در هر مرحله به درستی کار کند. خروجی هر مرحله ورودی بعدی خواهد بود.

ابزارهایی مانند Studio 3T به شما این امکان را می‌دهند که ورودی‌ها و خروجی‌های مرحله را هنگام ساخت پرس و جوی تجمع خود بررسی کنید.

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

برای دستیابی به عملکرد بهینه پرس و جو، تعدادی از بهترین شیوه ها وجود دارد که باید در نظر گرفته شوند. بعداً در مقاله به آنها خواهیم رسید.

دستور خط لوله جمعی MongoDB

این نمونه ای از نحوه ساخت پرس و جو تجمع است:

  • که در آن collectionName – نام یک مجموعه است،
  • خط لوله - آرایه ای است که شامل مراحل تجمع است،
  • گزینه ها - پارامترهای اختیاری برای تجمیع

این نمونه ای از نحو خط لوله تجمع است:

محدودیت های مرحله تجمع MongoDB

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

اگر مشکلی اجتناب‌ناپذیر شد، می‌توانید صفحه به دیسک را انتخاب کنید، تنها عیب آن این است که کمی بیشتر صبر خواهید کرد زیرا سرعت کار روی دیسک به جای حافظه کندتر است. برای انتخاب روش صفحه به دیسک، فقط باید گزینه allowDiskUse را به صورت true تنظیم کنید:

توجه داشته باشید که این گزینه همیشه خدمات اشتراکی در دسترس نیست. به عنوان مثال خوشه های Atlas M0، M2 و M5 این گزینه را غیرفعال می کنند.

اسناد بازگردانده شده توسط پرس و جو تجمع، یا به عنوان مکان نما یا ذخیره شده از طریق $out در مجموعه دیگری، محدود به 16 مگابایت است. یعنی نمی توانند بزرگتر از حداکثر اندازه سند MongoDB باشند.

اگر احتمال دارد از این حد تجاوز کنید، باید مشخص کنید که خروجی کوئری تجمیع به صورت مکان نما باشد و نه به عنوان سند.

داده های ما برای نمونه های انبوه MongoDB استفاده می شود

من نمونه های جمعی MongoDB را برای مهم ترین مراحل خط لوله نشان خواهم داد.

برای تشریح مثال ها از دو مجموعه استفاده می کنم. اولین مورد "دانشگاه ها" نامیده می شود و از این اسناد تشکیل شده است (داده ها واقعی نیستند):

اگر می‌خواهید این نمونه‌ها را روی نصب خودتان آزمایش کنید، می‌توانید آنها را با دستور bulk زیر وارد کنید یا آن را به عنوان یک فایل JSON وارد کنید:

مجموعه دوم و آخر "دوره ها" نام دارد و به شکل زیر است:

مجدداً می توانید آنها را به همان روش با استفاده از کد زیر یا با وارد کردن به عنوان یک فایل JSON وارد کنید:

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

نمونه های جمعی MongoDB

MongoDB $match

مرحله مسابقه $ به ما امکان می دهد فقط آن اسناد را از مجموعه ای که می خواهیم با آنها کار کنیم انتخاب کنیم. این کار را با فیلتر کردن مواردی که از الزامات ما پیروی نمی کنند ، انجام می دهد.

در مثال زیر ، ما فقط می خواهیم با آن اسناد کار کنیم که مشخص می کند اسپانیا ارزش کشور میدانی است و سالامانکا ارزش شهر میدانی است.

برای به دست آوردن یک خروجی قابل خواندن ، می خواهم در پایان همه دستورات اضافه کنم.

پروژه MongoDB $

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

مرحله پروژه $ برای انجام این کار و اضافه کردن هر زمینه محاسبه شده مورد نیاز شما استفاده می شود.

در این مثال ، ما فقط به کشور مزارع ، شهر و نام نیاز داریم.

در کدی که در زیر آمده است ، لطفاً توجه داشته باشید که:

  • ما باید صریحاً بنویسیم _id: 0 وقتی این قسمت مورد نیاز نیست
  • به غیر از قسمت _id ، کافی است فقط آن قسمت هایی را که باید در نتیجه پرس و جو بدست آوریم ، مشخص کنیم

.. نتیجه را می دهد ...

گروه MongoDB $

با مرحله گروهی $ ، ما می توانیم تمام نمایش داده های جمع آوری یا خلاصه ای را که لازم داریم انجام دهیم ، مانند یافتن تعداد ، کل ، میانگین یا حداکثر.

در این مثال ، ما می خواهیم تعداد اسناد در هر دانشگاه را در مجموعه "دانشگاه ها" بدانیم:

.. این نتیجه را تولید می کند ...

اپراتورهای جمع آوری گروه MongoDB $

مرحله گروهی $ از عبارات خاص (اپراتورها) پشتیبانی می کند که به کاربران امکان می دهد به عنوان بخشی از خط لوله جمع آوری ، کارآیی ، آرایه ، بولی و سایر عملیات را انجام دهند.

اپراتورمعنی
تعداد $مقدار اسناد را در گروه داده شده محاسبه می کند.
حداکثر دلارحداکثر مقدار قسمت یک سند را در مجموعه نشان می دهد.
دقیقهحداقل مقدار قسمت یک سند را در مجموعه نشان می دهد.
$ avgمقدار متوسط قسمت یک سند را در مجموعه نشان می دهد.
مبلغمقادیر مشخص شده کلیه اسناد موجود در مجموعه را خلاصه می کند.
فشارمقادیر اضافی را به آرایه سند حاصل اضافه می کند.

برای دیدن سایر اپراتورهای MongoDB و کسب اطلاعات بیشتر در مورد این موضوع ، بررسی کنید.

mongoDB $ خارج

این یک مرحله غیرمعمول است زیرا به شما امکان می دهد نتایج تجمع خود را در یک مجموعه جدید یا یک موجود موجود پس از رها کردن آن یا حتی اضافه کردن آنها به اسناد موجود (جدید در نسخه 4. 1. 2) حمل کنید.

مرحله $ خارج باید آخرین مرحله از خط لوله باشد.

برای اولین بار ، ما از یک جمع با بیش از یک مرحله استفاده می کنیم. اکنون دو ، یک گروه $ و یک $ خارج داریم:

اکنون ، ما محتوای مجموعه جدید "Agresults" را بررسی می کنیم:

در اینجا نحوه استفاده از مرحله $ خارج در این مثال سه قسمتی آورده شده است.

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

mongoDb $ unwind

مرحله Undind $ در MongoDB معمولاً در یک خط لوله یافت می شود زیرا وسیله ای برای پایان دادن است.

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

در جایی که یک قسمت آرایه در اسناد ورودی وجود دارد ، گاهی اوقات باید چندین بار سند را یک بار برای هر عنصر آن آرایه ، یک بار خروجی کنید.

هر نسخه از سند دارای قسمت آرایه ای است که با عنصر پی در پی جایگزین شده است.

در مثال بعدی ، من قصد دارم این مرحله را فقط در سندی اعمال کنم که نام فیلد آن شامل ارزش کاربردی است.

این سند است:

اکنون ، ما مرحله $ Undind را بر روی آرایه دانش آموز اعمال می کنیم و بررسی می کنیم که در هر عنصر آرایه یک سند دریافت می کنیم.

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

سند دوم از قسمتهای موجود در عنصر دوم آرایه و بقیه زمینه های مشترک و غیره ساخته شده است.

MongoDB $ مرتب سازی

برای مرتب کردن نتایج خود بر اساس مقدار یک قسمت خاص ، به مرحله $ مرتب سازی نیاز دارید.

به عنوان مثال ، بیایید اسناد به دست آمده را در نتیجه مرحله $ UNDIND توسط تعداد دانش آموزان به ترتیب نزولی مرتب کنیم.

برای به دست آوردن بازده کمتری ، من می خواهم فقط سال و تعداد دانش آموزان را به پروژه برسانم.

این نتیجه را می دهد ...

MongoDB $ حد

اگر فقط به دو نتیجه اول پرس و جو خود علاقه دارید چه می کنید؟به همین سادگی است:

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

اکنون ما یک خط لوله کامل داریم.

ما می توانیم این کل پرس و جو کل MongoDB و تمام مراحل آن را مستقیماً به ویرایشگر جمع در استودیو 3T بچسبانیم.

با کپی کردن آن و کلیک بر روی دکمه خمیر کد همانطور که نشان داده شده است ، چسبانده می شود.

The aggregation query has been pasted into Studio 3T

اطلاعات بیشتر در مورد ویرایشگر جمع ، استودیو 3T مرحله به مرحله سازنده جمع آوری MongoDB را بخوانید.

فقط بخشی که در زیر نشان داده شده است کپی و چسبانده شده است

در تصویر بعدی می توانیم خط لوله کامل را در استودیو 3T و خروجی آن مشاهده کنیم.

The image shows the entire aggregate pipeline and the query

حذف مراحل در استودیو 3T یک موضوع ساده برای استفاده از دکمه نشان داده شده در تصویر بعدی است.

Use the

$ addfields

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

این نتیجه را می دهد ...

MongoDb $ count

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

بیایید آن را در عمل ببینیم:

این کل سالهایی را که ما می دانیم تعداد دانشجویان دانشگاه را می دانیم فراهم می کند.

MongoDB $ Lookup

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

با استفاده از $ Lookup ، در اینجا یک پرس و جو کل وجود دارد که زمینه های دو مجموعه را ادغام می کند.

به مثال جستجوی $ دیگری نیاز دارید؟اینجا یکی است

اگر می خواهید این پرس و جو به سرعت اجرا شود ، شما نیاز به فهرست بندی نام در مجموعه دانشگاه ها و رشته دانشگاه در مجموعه دوره ها دارید.

به عبارت دیگر ، فراموش نکنید که زمینه های درگیر در جستجوی $ را فهرست بندی کنید.

mongoDb $ sortbycount

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

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

این خروجی است:

جنبه mongoDB $

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

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

اکنون می توانیم به لطف مرحله Facet $ ، این کار را در یک خط لوله انجام دهیم.

به این مثال نگاهی بیندازید:

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

آنها هر دو از دو مرحله اول ، مسابقه $ و جستجوی $ استفاده کردند.

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

ورزش

حال ، سعی کنید تمرین بعدی را خودتان حل کنید.

چگونه می توانیم تعداد کل دانش آموزانی را که تاکنون متعلق به هر یک از دانشگاه ها بوده اند ، بدست آوریم؟

بله ، من دو مرحله را ترکیب کرده ام. اما ، چگونه می توانیم یک پرس و جو بسازیم که خروجی را توسط میدان کلینی به ترتیب نزولی مرتب کند؟

درست است ، ما باید مرحله $ مرتب سازی () را در خروجی گروه $ () اعمال کنیم.

بررسی پرس و جو جمع آوری ما

من قبلاً خاطرنشان كردم كه بررسی اینكه مراحل پرس و جو ما روشی را كه ما برای انجام آنها نیاز داریم ، بسیار آسان و در واقع ضروری است.

کارایی

خط لوله جمع آوری به طور خودکار پرس و جو را با هدف بهبود عملکرد آن تغییر می دهد.

اگر هر دو مرحله مرتب سازی $ و $ را دارید ، همیشه بهتر است از مسابقه $ قبل از مرتب سازی $ استفاده کنید تا تعداد اسنادی را که مرحله مرتب سازی $ باید با آن مقابله کند ، به حداقل برسانید.

برای استفاده از فهرست ها ، باید این کار را در مرحله اول خط لوله خود انجام دهید. و در اینجا ، شما باید از مراحل $ $ یا $ مرتب سازی استفاده کنید.

ما می توانیم بررسی کنیم که آیا پرس و جو از یک شاخص از طریق روش توضیح () استفاده می کند.

شما همیشه می توانید با کلیک بر روی برگه توضیح ، برنامه توضیح () هر پرس و جو جمع آوری را به عنوان یک نمودار یا در JSON مشاهده کنید.

MongoDB_Aggregate Pipeline Explain

نتیجه

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

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

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

همیشه نکته ای وجود دارد که در آن فرد باید خط لوله تجمع در حال رشد را در یک IDE برای MongoDB مانند استودیو 3T ، با یک ویرایشگر جمع آوری داخلی قرار دهد ، بنابراین می توانید هر مرحله را به طور مستقل اشکال زد.

ثبت دیدگاه

مجموع دیدگاهها : 0در انتظار بررسی : 0انتشار یافته : ۰
قوانین ارسال دیدگاه
  • دیدگاه های ارسال شده توسط شما، پس از تایید توسط تیم مدیریت در وب منتشر خواهد شد.
  • پیام هایی که حاوی تهمت یا افترا باشد منتشر نخواهد شد.
  • پیام هایی که به غیر از زبان فارسی یا غیر مرتبط باشد منتشر نخواهد شد.