یک خط لوله تجمع عملکرد و قابلیت استفاده بهتری نسبت به یک عملیات کاهش نقشه فراهم می کند.
عملیات کاهش نقشه را می توان با استفاده از اپراتورهای خط لوله جمع آوری ، مانند گروه $ ، ادغام $ و سایر موارد بازنویسی کرد.
برای عملیات کاهش نقشه که نیاز به عملکرد سفارشی دارند ، MongoDB اپراتورهای جمع کننده $ و $ عملکرد را که از نسخه 4. 4 شروع می شود ، فراهم می کند. از این اپراتورها برای تعریف عبارات جمع آوری سفارشی در JavaScript استفاده کنید.
در مونگوش ، روش db. collection. mapreduce () یک بسته بندی در اطراف دستور mapreduce است. مثالهای زیر از روش db. collection. mapreduce () استفاده می کنند.
مثالهای موجود در این بخش شامل گزینه های خط لوله جمع آوری بدون عبارات جمع آوری سفارشی است. برای گزینه های دیگری که از عبارات سفارشی استفاده می کنند ، به نمونه های ترجمه خط لوله نقشه به MAP-REDUCE مراجعه کنید.
با این اسناد سفارشات مجموعه نمونه ایجاد کنید:
dbسفارش.درج( [ |
<_شناسه: 1, cust_id: "Ant O. Knee", ord_date: جدید تاریخ("2020-03-01") , قیمت: 25, موارد: [ <اسکی: "پرتقال ها", qty: 5, قیمت: 2.5> , <اسکی: "سیب", qty: 5, قیمت: 2.5> ] , وضعیت: "آ"> , |
<_شناسه: 2, cust_id: "Ant O. Knee", ord_date: جدید تاریخ("2020-03-08") , قیمت: 70, موارد: [ <اسکی: "پرتقال ها", qty: 8, قیمت: 2.5> , <اسکی: "شکلات", qty: 5, قیمت: 10> ] , وضعیت: "آ"> , |
<_شناسه: 3, cust_id: "Busby Bee", ord_date: جدید تاریخ("2020-03-08") , قیمت: 50, موارد: [ <اسکی: "پرتقال ها", qty: 10, قیمت: 2.5> , <اسکی: "گلابی ها", qty: 10, قیمت: 2.5> ] , وضعیت: "آ"> , |
<_شناسه: 4, cust_id: "Busby Bee", ord_date: جدید تاریخ("2020-03-18") , قیمت: 25, موارد: [ <اسکی: "پرتقال ها", qty: 10, قیمت: 2.5> ] , وضعیت: "آ"> , |
<_شناسه: 5, cust_id: "Busby Bee", ord_date: جدید تاریخ("2020-03-19") , قیمت: 50, موارد: [ <اسکی: "شکلات", qty: 5, قیمت: 10> ] , وضعیت: "آ"> , |
<_شناسه: 6, cust_id: "بادامک elot", ord_date: جدید تاریخ("2020-03-19") , قیمت: 35, موارد: [ <اسکی: "هویج", qty: 10, قیمت: 1.0> , <اسکی: "سیب", qty: 10, قیمت: 2.5> ] , وضعیت: "آ"> , |
<_شناسه: 7, cust_id: "بادامک elot", ord_date: جدید تاریخ("2020-03-20") , قیمت: 25, موارد: [ <اسکی: "پرتقال ها", qty: 10, قیمت: 2.5> ] , وضعیت: "آ"> , |
<_شناسه: 8, cust_id: "دون کوئیس", ord_date: جدید تاریخ("2020-03-20") , قیمت: 75, موارد: [ <اسکی: "شکلات", qty: 5, قیمت: 10> , <اسکی: "سیب", qty: 10, قیمت: 2.5> ] , وضعیت: "آ"> , |
<_شناسه: 9, cust_id: "دون کوئیس", ord_date: جدید تاریخ("2020-03-20") , قیمت: 55, موارد: [ <اسکی: "هویج", qty: 5, قیمت: 1.0> , <اسکی: "سیب", qty: 10, قیمت: 2.5> , <اسکی: "پرتقال ها", qty: 10, قیمت: 2.5> ] , وضعیت: "آ"> , |
<_شناسه: 10, cust_id: "دون کوئیس", ord_date: جدید تاریخ("2020-03-23") , قیمت: 25, موارد: [ <اسکی: "پرتقال ها", qty: 10, قیمت: 2.5> ] , وضعیت: "آ"> |
]) |
قیمت کل برای هر مشتری را برگردانید
عملیات کاهش نقشه را بر روی مجموعه سفارشات انجام دهید تا توسط CUST_ID گروه بندی کنید و مبلغ قیمت هر CUST_ID را محاسبه کنید:
- عملکرد نقشه را برای پردازش هر سند ورودی تعریف کنید:
- در عملکرد ، این به سندی اشاره دارد که عملکرد MAP-REDUCE در حال پردازش است.
- این تابع قیمت را به CUST_ID برای هر سند ترسیم می کند و CUST_ID و قیمت را منتشر می کند.
قارچmapFunction1 =تابع( ) |
بیرون ریختن(این.cust_id, این.قیمت) ; |
> ; |
- ارزش های مقادیر آرایه ای است که عناصر آن مقادیر قیمت ساطع شده توسط عملکرد MAP است و توسط KeyCustid گروه بندی می شود.
- این تابع آرایه ارزش های ارزش را به جمع عناصر آن کاهش می دهد.
قارچکاهش عملکرد 1 =تابع(keycustid ، ارزش های) |
برگشت آرایه.جمع(ارزش های ارزش) ؛ |
> ; |
dbسفارش.مپدویچ کردن( |
mapfunction1 ، |
کاهش عملکرد 1 ، |
<خارج: "map_reduce_example"> |
) |
dbmap_reduce_example.پیدا کردن( ).مرتب سازی( <_شناسه: 1> ) |
عملیات این اسناد را برمی گرداند:
<"_شناسه" : "Ant O. Knee", "ارزش" : 95> |
<"_شناسه" : "Busby Bee", "ارزش" : 125> |
<"_شناسه" : "بادامک elot", "ارزش" : 60> |
<"_شناسه" : "دون کوئیس", "ارزش" : 155> |
جایگزین تجمع
با استفاده از اپراتورهای خط لوله جمع آوری موجود ، می توانید بدون تعریف توابع سفارشی ، عملیات کاهش نقشه را بازنویسی کنید:
dbسفارش.تجمیع( [ |
<گروه $: <_شناسه: "$ cust_id", ارزش: <مبلغ: "قیمت $">>> , |
<$: "agg_alteative_1"> |
]) |
- گروه های مرحله گروه $ توسط CUST_ID و قسمت ارزش را محاسبه می کنند (همچنین به مبلغ $ مراجعه کنید). قسمت ارزش حاوی کل قیمت هر CUST_ID است. مرحله اسناد زیر را به مرحله بعدی خروجی می کند:
<"_شناسه" : "دون کوئیس", "ارزش" : 155> |
<"_شناسه" : "Ant O. Knee", "ارزش" : 95> |
<"_شناسه" : "بادامک elot", "ارزش" : 60> |
<"_شناسه" : "Busby Bee", "ارزش" : 125> |
dbagg_alteative_1.پیدا کردن( ).مرتب سازی( <_شناسه: 1> ) |
این عملیات اسناد زیر را برمی گرداند:
<"_شناسه" : "Ant O. Knee", "ارزش" : 95> |
<"_شناسه" : "Busby Bee", "ارزش" : 125> |
<"_شناسه" : "بادامک elot", "ارزش" : 60> |
<"_شناسه" : "دون کوئیس", "ارزش" : 155> |
نکته
همچنین ببینید:
برای جایگزینی که از عبارات تجمیع سفارشی استفاده می کند ، به نمونه های ترجمه خط لوله نقشه به نقشه-کاهش به نقشه مراجعه کنید.
سفارش و مقدار کل را با مقدار متوسط در هر مورد محاسبه کنید
در مثال زیر ، یک عملیات کاهش نقشه را در مجموعه سفارشات برای کلیه اسنادی که دارای مقدار ORD_DATE بیشتر از یا مساوی با 2020-03-01 هستند ، مشاهده خواهید کرد.
عمل در مثال:
- گروه ها توسط قسمت موردی. sku ، و تعداد سفارشات و مقدار کل سفارش داده شده برای هر SKU را محاسبه می کنند.
- میانگین مقدار در هر سفارش را برای هر مقدار SKU محاسبه می کند و نتایج را در مجموعه خروجی ادغام می کند.
هنگام ادغام نتایج ، اگر یک سند موجود همان کلید نتیجه جدید را داشته باشد ، این عملیات سند موجود را بازنویسی می کند. اگر هیچ سند موجود با همان کلید وجود نداشته باشد ، این عملیات سند را درج می کند.
- عملکرد نقشه را برای پردازش هر سند ورودی تعریف کنید:
- در عملکرد ، این به سندی اشاره دارد که عملکرد MAP-REDUCE در حال پردازش است.
- برای هر مورد ، عملکرد SKU را با یک مقدار شیء جدید که شامل تعداد 1 و مورد Qty برای سفارش است ، مرتبط می کند و SKU (ذخیره شده در کلید) و مقدار را منتشر می کند.
قارچmapFunction2 =تابع( ) |
برای (قارچidx =0؛بت<این.موارد.طول؛idx + +) |
قارچکلید =این.موارد[idx].اسکی; |
قارچمقدار =<شمردن: 1, qty: این.موارد[idx].qty> ; |
بیرون ریختن( ارزش کلیدی) ؛ |
> |
> ; |
- Countobjvals آرایه ای است که عناصر آن اشیاء نقشه برداری شده به مقادیر گروهی Keysku است که توسط عملکرد MAP به عملکرد کاهش دهنده منتقل می شوند.
- این عملکرد آرایه Countobjvals را به یک شیء واحد کاهش می دهد که حاوی تعداد و قسمتهای QTY است.
- در CreatedVal ، قسمت Count شامل مجموع قسمت های شمارش از عناصر آرایه فردی است و قسمت QTY حاوی مجموع زمینه های QTY از عناصر آرایه فردی است.
قارچکاهش عملکرد 2 =تابع(Keysku ، Countobjvals) |
کاهش یافته =<شمردن: 0, qty: 0> ; |
برای (قارچidx =0؛بتطول؛idx + +) |
کاهش یافتهشمردن+ = countobjvals [idx].شمردن; |
کاهش یافتهqty+ = countobjvals [idx].qty; |
> |
برگشتکاهش ارزش ؛ |
> ; |
قارچFinalizeFunction2 =تابع (کلید ، کاهش یافته) |
کاهش یافتهبا منزل کردن= کاهش ارزش.qty/ کاهششمردن; |
برگشتکاهش ارزش ؛ |
> ; |
dbسفارش.مپدویچ کردن( |
mapFunction2 ، |
کاهش عملکرد 2 ، |
| |
خارج: <ادغام: "map_reduce_example2"> , |
پرس و جو: <ord_date: <$ gte: جدید تاریخ("2020-03-01")>> , |
نهایی کردن: FinalizeFunction2 |
> |
) ; |
dbmap_reduce_example2.پیدا کردن( ).مرتب سازی( <_شناسه: 1> ) |
عملیات این اسناد را برمی گرداند:
<"_شناسه" : "سیب", "ارزش" : <"شمردن" : 4, "qty" : 35, "AVG" : 8. 75>> |
<"_شناسه" : "هویج", "ارزش" : <"شمردن" : 2, "qty" : 15, "AVG" : 7.5>> |
<"_شناسه" : "شکلات", "ارزش" : <"شمردن" : 3, "qty" : 15, "AVG" : 5>> |
<"_شناسه" : "پرتقال ها", "ارزش" : <"شمردن" : 7, "qty" : 63, "AVG" : 9>> |
<"_شناسه" : "گلابی ها", "ارزش" : <"شمردن" : 1, "qty" : 10, "AVG" : 10>> |
جایگزین تجمع
با استفاده از اپراتورهای خط لوله جمع آوری موجود ، می توانید بدون تعریف توابع سفارشی ، عملیات کاهش نقشه را بازنویسی کنید:
dbسفارش.تجمیع( [ |
<مسابقه: <ord_date: <$ gte: جدید تاریخ("2020-03-01")>>> , |
<$ UNIND: "موارد $"> , |
<گروه $: <_شناسه: "$ items. sku", qty: <مبلغ: "$ items. qty"> , orders_ids: <$ addtoset: "$ _id">>> , |
<$: <ارزش: <شمردن: <اندازه: "$ orders_ids"> , qty: "$ qty", با منزل کردن: <تقسیم $: [ "$ qty", <اندازه: "$ orders_ids"> ]>>>> , |
<ادغام $: <به: "agg_alteative_3", on: "_شناسه", چه موقع: "جایگزین کردن", وقتی: "درج">> |
] ) |
- مرحله مسابقه $ فقط آن اسناد را با ord_date بیشتر از یا مساوی با تاریخ جدید ("2020-03-01") انتخاب می کند.
- مرحله $ Undind سند را توسط قسمت Array Array برای خروجی یک سند برای هر عنصر آرایه تجزیه می کند. مثلا:
<"_شناسه" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ایزودات("2020-03-01T00: 00: 00Z") , "قیمت" : 25, "موارد" : <"SKU" : "پرتقال ها", "qty" : 5, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ایزودات("2020-03-01T00: 00: 00Z") , "قیمت" : 25, "موارد" : <"SKU" : "سیب", "qty" : 5, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ایزودات("2020-03-08T00: 00: 00Z") , "قیمت" : 70, "موارد" : <"SKU" : "پرتقال ها", "qty" : 8, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ایزودات("2020-03-08T00: 00: 00Z") , "قیمت" : 70, "موارد" : <"SKU" : "شکلات", "qty" : 5, "قیمت" : 10> , "وضعیت" : "آ"> |
<"_شناسه" : 3, "cust_id" : "Busby Bee", "ord_date" : ایزودات("2020-03-08T00: 00: 00Z") , "قیمت" : 50, "موارد" : <"SKU" : "پرتقال ها", "qty" : 10, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 3, "cust_id" : "Busby Bee", "ord_date" : ایزودات("2020-03-08T00: 00: 00Z") , "قیمت" : 50, "موارد" : <"SKU" : "گلابی ها", "qty" : 10, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 4, "cust_id" : "Busby Bee", "ord_date" : ایزودات("2020-03-18T00: 00: 00Z") , "قیمت" : 25, "موارد" : <"SKU" : "پرتقال ها", "qty" : 10, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 5, "cust_id" : "Busby Bee", "ord_date" : ایزودات("2020-03-19T00: 00: 00Z") , "قیمت" : 50, "موارد" : <"SKU" : "شکلات", "qty" : 5, "قیمت" : 10> , "وضعیت" : "آ"> |
. |
- میدان Qty. قسمت QTY شامل کل QTY سفارش داده شده در هر مورد است. sku (به مبلغ $ مراجعه کنید).
- Array orders_ids. قسمت orders_ids حاوی مجموعه ای از سفارش مجزا _id برای آیتم ها است. sku (به $ addtoset مراجعه کنید).
<"_شناسه" : "شکلات", "qty" : 15, "orders_ids" : [ 2, 5, 8 ]> |
<"_شناسه" : "پرتقال ها", "qty" : 63, "orders_ids" : [ 4, 7, 3, 2, 9, 1, 10 ]> |
<"_شناسه" : "هویج", "qty" : 15, "orders_ids" : [ 6, 9 ]> |
<"_شناسه" : "سیب", "qty" : 35, "orders_ids" : [ 9, 8, 1, 6 ]> |
<"_شناسه" : "گلابی ها", "qty" : 10, "orders_ids" : [ 3 ]> |
<"_شناسه" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ایزودات("2020-03-01T00: 00: 00Z") , "قیمت" : 25, "موارد" : <"SKU" : "پرتقال ها", "qty" : 5, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 1, "cust_id" : "Ant O. Knee", "ord_date" : ایزودات("2020-03-01T00: 00: 00Z") , "قیمت" : 25, "موارد" : <"SKU" : "سیب", "qty" : 5, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ایزودات("2020-03-08T00: 00: 00Z") , "قیمت" : 70, "موارد" : <"SKU" : "پرتقال ها", "qty" : 8, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 2, "cust_id" : "Ant O. Knee", "ord_date" : ایزودات("2020-03-08T00: 00: 00Z") , "قیمت" : 70, "موارد" : <"SKU" : "شکلات", "qty" : 5, "قیمت" : 10> , "وضعیت" : "آ"> |
<"_شناسه" : 3, "cust_id" : "Busby Bee", "ord_date" : ایزودات("2020-03-08T00: 00: 00Z") , "قیمت" : 50, "موارد" : <"SKU" : "پرتقال ها", "qty" : 10, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 3, "cust_id" : "Busby Bee", "ord_date" : ایزودات("2020-03-08T00: 00: 00Z") , "قیمت" : 50, "موارد" : <"SKU" : "گلابی ها", "qty" : 10, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 4, "cust_id" : "Busby Bee", "ord_date" : ایزودات("2020-03-18T00: 00: 00Z") , "قیمت" : 25, "موارد" : <"SKU" : "پرتقال ها", "qty" : 10, "قیمت" : 2.5> , "وضعیت" : "آ"> |
<"_شناسه" : 5, "cust_id" : "Busby Bee", "ord_date" : ایزودات("2020-03-19T00: 00: 00Z") , "قیمت" : 50, "موارد" : <"SKU" : "شکلات", "qty" : 5, "قیمت" : 10> , "وضعیت" : "آ"> |
. |
- میدان Qty. قسمت QTY شامل کل QTY سفارش داده شده در هر مورد است. sku با استفاده از مبلغ $.
- Array orders_ids. قسمت orders_ids حاوی مجموعه ای از سفارش مجزا _id برای آیتم ها است. sku با استفاده از $ addtoset.
<"_شناسه" : "شکلات", "qty" : 15, "orders_ids" : [ 2, 5, 8 ]> |
<"_شناسه" : "پرتقال ها", "qty" : 63, "orders_ids" : [ 4, 7, 3, 2, 9, 1, 10 ]> |
<"_شناسه" : "هویج", "qty" : 15, "orders_ids" : [ 6, 9 ]> |
<"_شناسه" : "سیب", "qty" : 35, "orders_ids" : [ 9, 8, 1, 6 ]> |
<"_شناسه" : "گلابی ها", "qty" : 10, "orders_ids" : [ 3 ]> |
- مقدار. به اندازه آرایه orders_ids با استفاده از اندازه $.
- مقدار. Qty به قسمت QTY سند ورودی.
- مقدار. avg به میانگین تعداد QTY در هر سفارش با استفاده از $ تقسیم و اندازه $.
<"_شناسه" : "سیب", "ارزش" : <"شمردن" : 4, "qty" : 35, "AVG" : 8. 75>> |
<"_شناسه" : "گلابی ها", "ارزش" : <"شمردن" : 1, "qty" : 10, "AVG" : 10>> |
<"_شناسه" : "شکلات", "ارزش" : <"شمردن" : 3, "qty" : 15, "AVG" : 5>> |
<"_شناسه" : "پرتقال ها", "ارزش" : <"شمردن" : 7, "qty" : 63, "AVG" : 9>> |
<"_شناسه" : "هویج", "ارزش" : <"شمردن" : 2, "qty" : 15, "AVG" : 7.5>> |
dbagg_alteative_3.پیدا کردن( ).مرتب سازی( <_شناسه: 1> ) |
این عملیات اسناد زیر را برمی گرداند:
<"_شناسه" : "سیب", "ارزش" : <"شمردن" : 4, "qty" : 35, "AVG" : 8. 75>> |
<"_شناسه" : "هویج", "ارزش" : <"شمردن" : 2, "qty" : 15, "AVG" : 7.5>> |
<"_شناسه" : "شکلات", "ارزش" : <"شمردن" : 3, "qty" : 15, "AVG" : 5>> |
<"_شناسه" : "پرتقال ها", "ارزش" : <"شمردن" : 7, "qty" : 63, "AVG" : 9>> |
<"_شناسه" : "گلابی ها", "ارزش" : <"شمردن" : 1, "qty" : 10, "AVG" : 10>> |
نکته
همچنین ببینید:
برای جایگزینی که از عبارات تجمیع سفارشی استفاده می کند ، به نمونه های ترجمه خط لوله نقشه به نقشه-کاهش به نقشه مراجعه کنید.
خبرهای فارکس...
ما را در سایت خبرهای فارکس دنبال می کنید
برچسب : نویسنده : شهره لرستانی بازدید : 44 تاريخ : شنبه 7 مرداد 1402 ساعت: 16:54