Contents

Jak korzystać z potoku agregacji w MongoDB

Potok agregacji jest zalecanym sposobem uruchamiania złożonych zapytań w MongoDB. Jeśli korzystałeś z MapReduce MongoDB, lepiej przełącz się na potok agregacji, aby uzyskać bardziej wydajne obliczenia.

Czym jest agregacja w MongoDB i jak działa?

/pl/images/aggregation-pipeline-process-example-1.jpeg

Potok agregacji, znany również jako potok “Agg”, to kompleksowy mechanizm zapytań w MongoDB, który ułatwia złożoną analizę danych i manipulację nimi. Wykorzystując szereg połączonych ze sobą etapów, potok ten umożliwia użytkownikom wykonywanie różnych operacji na ich zbiorach danych poprzez wykorzystanie danych wyjściowych jednego etapu jako danych wejściowych dla kolejnych etapów. To wszechstronne narzędzie umożliwia użytkownikom usprawnienie zadań przetwarzania danych przy jednoczesnym zwiększeniu ogólnej wydajności i dokładności.

Można na przykład przesłać wynik procesu dopasowywania do kolejnych etapów w celu zmiany układu zgodnie ze wspomnianym układem, aż do uzyskania preferowanego wyniku.

W trakcie potoku agregacji każda faza składa się z komponentu MongoDB i generuje jeden lub więcej zmodyfikowanych dokumentów jako dane wyjściowe. Częstotliwość, z jaką dany poziom pojawia się w potoku, zależy od konkretnego charakteru zapytania. W niektórych przypadkach może być konieczne włączenie operatorów, takich jak

Etapy potoku agregacji

Potok agregacji przekazuje dane przez wiele etapów w jednym zapytaniu. Istnieje kilka etapów, a ich szczegóły można znaleźć w dokumentacji MongoDB .

Określmy kilka najbardziej rozpowszechnionych terminów w tym kontekście.

Etap $match

Początkowa faza tego procesu pozwala na ustalenie dokładnych kryteriów wyboru, które można zastosować przed zainicjowaniem kolejnych etapów agregacji. Wykorzystując ten wstępny krok, można zidentyfikować i wyodrębnić poszczególne elementy zbioru danych, które są uważane za istotne do włączenia do szerszego potoku agregacji.

Etap $group

Faza grupowania organizuje informacje w odrębne kategorie poprzez wykorzystanie par klucz-wartość, przy czym każda kategoria odpowiada elementowi w raporcie końcowym.

Rozważmy następujące przykładowe dane sprzedaży jako przykład:

/pl/images/sample-data-for-example.jpg

Wykorzystanie potoku agregacji umożliwia obliczenie zarówno ogólnej wielkości sprzedaży, jak i produktów generujących największe przychody w ramach każdej odpowiedniej kategorii.

 {
 $group: {
    _id: $Section,
    total_sales_count: {$sum : $Sold},
    top_sales: {$max: $Amount},
  }
}

Funkcjonalność grupowania MongoDB pozwala na organizowanie dokumentów zgodnie z ich podziałami na sekcje. Osiąga się to poprzez wykorzystanie pola id \_\ w połączeniu z określonym kluczem. Stosując określone operatory agregacji, takie jak \ \ sum, \ \ min, \ \ max lub \ \_avg, MongoDB generuje nowe identyfikatory dla każdej grupy w oparciu o operacje określone w agregatorze.

Etap $skip

Wykorzystanie etapu “$skip” w potoku agregacji pozwala na pominięcie z góry określonej liczby dokumentów z końcowego zestawu wyników. Zazwyczaj etap ten jest stosowany po etapie grupowania i służy do usprawnienia danych wyjściowych poprzez wykluczenie tych dokumentów, które nie są pożądane. Na przykład, jeśli przewiduje się, że zostaną utworzone dwa dokumenty, ale jeden musi zostać odrzucony, proces agregacji da tylko pozostały dokument.

Aby włączyć krok pomijania do potoku agregacji, można wprowadzić w nim operację “$skip”.

 ...,
{
    $skip: 1
  },

Etap $sort

Proces sortowania umożliwia organizację informacji w sposób malejący lub rosnący. Na przykład, można zdecydować się na zmianę kolejności zbioru danych z poprzedniego scenariusza zapytania z malejącym rzędem wielkości, aby rozróżnić, który dział wykazuje największy poziom sprzedaży.

Zmodyfikuj poprzednie zapytanie, włączając operator “$sort” w następujący sposób:

 ...,
{
    $sort: {top_sales: -1}
  },

Etap $limit

Wykorzystanie operacji “limit” ułatwia redukcję pożądanych dokumentów wyjściowych wyświetlanych przez potok agregacji. Aby zilustrować tę koncepcję, rozważ zastosowanie operatora “$limit” w celu pobrania określonej sekcji, która została zidentyfikowana jako ta, która osiągnęła najwyższy poziom sprzedaży na poprzednim etapie przetwarzania:

 ...,
{
    $sort: {top_sales: -1}
  },

{"$limit": 1}

Powyższy wynik daje wyłącznie początkowy dokument; ten konkretny segment stanowi część o największych przychodach, ponieważ zajmuje najwyższą pozycję na ułożonej liście wyników.

Etap $project

Dyrektywa $project oferuje pewien stopień elastyczności w odniesieniu do kształtowania ostatecznego wyniku, umożliwiając określenie pożądanych pól i odpowiadających im nazw kluczy.

Rzeczywiście, rozważmy przykładowy wynik z wyłączeniem etapu “$project”, który może wyglądać następująco:

/pl/images/sample-unarranged-data-for-aggregation-pipeline.jpg

Aby włączyć projekt do naszego potoku, zbadamy jego wygląd, gdy jest powiązany z etykietą “$project”. Aby osiągnąć tę integrację, wykonaj następujące kroki:

 ...,

{
        "$project": {
            "_id": 0,
            "Section": "$_id",
            "TotalSold": "$total_sales_count",
            "TopSale": "$top_sales",

        }
    }

Biorąc pod uwagę naszą poprzednią organizację danych według kategorii produktów, powyższe podejście obejmuje wszystkie odpowiednie sekcje produktów w wygenerowanym raporcie. Ponadto gwarantuje, że zarówno ogólna wartość sprzedaży, jak i wyróżniony najlepiej sprzedający się produkt są zintegrowane jako część końcowego wyniku, reprezentowanego odpowiednio przez wskaźniki “Total Sold” i “Top Sale”.

Zmieniony wynik wykazuje wyższy stopień dopracowania w porównaniu do swojego poprzednika, pokazując lepszą organizację i przejrzystość prezentacji.

/pl/images/sample-output-for-aggregation-pipeline-stages.jpg

Etap $unwind

Etap unwind w MongoDB jest odpowiedzialny za dekonstrukcję tablicy zawartej w pojedynczym dokumencie i przekształcenie jej w wiele dokumentów. Dla ilustracji rozważmy następujący przykładowy zestaw danych zamówień:

/pl/images/sample-orders-data.jpg

Wykorzystanie etapu $unwind jest skuteczną metodą demontażu tablicy pozycji przed wdrożeniem dodatkowych operacji agregacji. Krok ten okazuje się szczególnie przydatny podczas próby obliczenia statystyki podsumowującej dla każdego elementu w tablicy. Jako przykład ilustrujący, rozważmy obliczenie zagregowanych przychodów generowanych przez poszczególne produkty.

 db.Orders.aggregate(
[
  {
    "$unwind": "$items"
  },
  {
    "$group": {
      "_id": "$items.product",
      "total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
    }
  },
  {
    "$sort": { "total_revenue": -1 }
  },

  {
        "$project": {
            "_id": 0,
            "Product": "$_id",
            "TotalRevenue": "$total_revenue",

        }
    }
])

Oczywiście, oto bardziej wyrafinowana wersja wyniku wygenerowanego przez wcześniej wspomniane zapytanie zbiorcze:

/pl/images/sample-result-for-unwind-stage.jpg

Jak utworzyć potok agregacji w MongoDB

Wyżej wymienione etapy zapewniają kompleksowe zrozumienie procesu aplikacji dla różnych operacji w ramach potoku agregacji, obejmując podstawowe zapytania związane z każdym etapem.

Pozwólcie, że przedstawię bardziej wyrafinowaną wersję podanego tekstu: W świetle naszego badania poprzedniego zbioru danych sprzedaży, rozsądne jest przedstawienie przeglądu kilku kluczowych etapów w ramach potoku agregacji jako całości. W ten sposób możemy uzyskać kompleksową perspektywę procesu przekształcania surowych danych w znaczące spostrzeżenia.

 db.sales.aggregate([

    {
        "$match": {
            "Sold": { "$gte": 5 }
            }
    },

        {

        "$group": {
            "_id": "$Section",
            "total_sales_count": { "$sum": "$Sold" },
            "top_sales": { "$max": "$Amount" },
            
        }

    },

    {
        "$sort": { "top_sales": -1 }
    },

    {"$skip": 0},

    {
        "$project": {
            "_id": 0,
            "Section": "$_id",
            "TotalSold": "$total_sales_count",
            "TopSale": "$top_sales",

        }
    }
    
])

Produkt końcowy wykazuje uderzające podobieństwo do czegoś, z czym mieliśmy do czynienia wcześniej, wywołując uczucie znajomości, a może nawet deja vu.

/pl/images/sample-output-for-aggregation-pipeline-stages.jpg

Aggregation Pipeline vs. MapReduce

Przed jego usunięciem, począwszy od wersji 5.0 MongoDB, tradycyjną metodą wykonywania agregacji danych w bazie danych było wykorzystanie MapReduce. Podczas gdy MapReduce posiada szereg potencjalnych zastosowań poza MongoDB, jest ogólnie uważany za mniej wydajny w porównaniu do potoku agregacji, co wymaga użycia zewnętrznych skryptów do indywidualnego definiowania zarówno procesów mapowania, jak i redukcji.

W przeciwieństwie do tego, potok agregacji w MongoDB oferuje unikalną metodę wykonywania skomplikowanych zapytań przy zachowaniu większej wydajności i organizacji w porównaniu do innych podejść. Co więcej, potok ten zawiera dodatkowe funkcje, które pozwalają na większe dostosowanie wynikowego wyniku.

Przejście z MapReduce do potoku agregacji przedstawia wiele różnic, które można napotkać podczas tego procesu.

Wydajne zapytania Big Data w MongoDB

Aby skutecznie przetwarzać skomplikowane informacje przechowywane w MongoDB, kluczowe znaczenie ma optymalizacja zapytań w celu uzyskania maksymalnej wydajności. Na szczęście potok agregacji oferuje doskonałe rozwiązanie do wykonywania kompleksowych obliczeń na złożonych zestawach danych. W przeciwieństwie do zindywidualizowanych operacji, które często obniżają wydajność, struktura agregacji umożliwia użytkownikom usprawnienie wielu etapów przetwarzania w wysoce wydajny, pojedynczy potok. W ten sposób te uciążliwe zadania mogą być wykonywane ze zwiększoną szybkością i dokładnością w ujednolicony sposób.

Wykorzystanie indeksowania może znacznie zwiększyć wydajność operacji agregacji w MongoDB, ponieważ zmniejsza ilość danych, które muszą być skanowane na każdym etapie procesu.