Udostępnij za pośrednictwem


Wprowadzenie do potoku agregacji

Potok agregacji to zaawansowane narzędzie, które umożliwia deweloperom przeprowadzanie zaawansowanej analizy danych i manipulowania ich kolekcjami. Potok jest sekwencją operacji przetwarzania danych, które są wykonywane na dokumentach wejściowych w celu wygenerowania obliczonych danych wyjściowych. Etapy potoku przetwarzają dokumenty wejściowe i przekazują wynik do następnego etapu. Każdy etap wykonuje określoną operację na danych, takich jak filtrowanie, grupowanie, sortowanie i przekształcanie.

Podstawowa składnia

Podstawowa składnia potoku agregacji jest następująca:

db.collection.aggregate([    { stage1 },    { stage2 },    ...    { stageN }])

Gdzie db.collection to kolekcja MongoDB, na której chcesz wykonać agregację, a etapy stage1, stage2, ..., stageN to etapy potoku, które chcesz zastosować.

Przykładowe etapy

Usługa Cosmos DB dla bazy danych MongoDB udostępnia szeroką gamę etapów, których można używać w potoku, w tym:

  • $match: filtruje dokumenty, aby przekazywać tylko dokumenty zgodne z określonym warunkiem.
  • $project: przekształca dokumenty w nowy formularz, dodając, usuwając lub aktualizując pola.
  • $group: grupuje dokumenty według co najmniej jednego pola i wykonuje różne funkcje agregujące na pogrupowanych danych.
  • $sort: sortuje dokumenty na podstawie określonych pól.
  • $skip: pomija określoną liczbę dokumentów.
  • $limit: ogranicza liczbę dokumentów przekazanych do następnego etapu.
  • $unwind: Dekonstrukuje pole tablicy z dokumentów wejściowych w celu wyprowadzenia dokumentu dla każdego elementu.

Aby wyświetlić wszystkie dostępne etapy, zobacz obsługiwane funkcje

Przykłady

Poniżej przedstawiono kilka przykładów użycia potoku agregacji do wykonywania różnych operacji na danych:

Filtrowanie: aby filtrować dokumenty, które mają pole "quantity" większe niż 20, możesz użyć następującego potoku:

db.collection.aggregate([
    { $match: { quantity: { $gt: 20 } } }
])

Grupowanie: aby pogrupować dokumenty według pola "kategoria" i obliczyć łączną "ilość" dla każdej grupy, możesz użyć następującego potoku:

db.collection.aggregate([
    { $group: { _id: "$category", totalQuantity: { $sum: "$quantity" } } }
])

Sortowanie: aby posortować dokumenty według pola "price" w kolejności malejącej, możesz użyć następującego potoku:

db.collection.aggregate([
    { $sort: { price: -1 } }
])

Przekształcanie: Aby dodać nowe pole "rabat" do dokumentów o wartości "price" większej niż 100, możesz użyć następującego potoku:

db.collection.aggregate([
    { $project: { item: 1, price: 1, discount: { $cond: [{ $gt: ["$price", 100] }, 10, 0 ] } } }
])

Odwijanie: aby oddzielić wszystkie dokumenty podrzędne od pola tablicy "tags" i utworzyć nowy dokument dla każdej wartości, możesz użyć następującego potoku:

db.collection.aggregate([
    { $unwind: "$tags" }
])

Przykład z wieloma etapami

db.sales.aggregate([
  { $match: { date: { $gte: "2021-01-01", $lt: "2021-03-01" } } },
  { $group: { _id: "$category", totalSales: { $sum: "$sales" } } },
  { $sort: { totalSales: -1 } },
  { $limit: 5 }
])

W tym przykładzie używamy przykładowej kolekcji o nazwie "sales", która zawiera dokumenty z następującymi polami: "date", "category" i "sales".

Pierwszy etap { $match: { date: { $gte: "2021-01-01", $lt: "2021-03-01" } } filtruje dokumenty według pola "date", przekazując dokumenty tylko z datą od 1 stycznia 2021 r. do 28 lutego 2021 r. Używamy formatu daty ciągu z formatem "RRRR-MM-DD".

Drugi etap { $group: { _id: "$category", totalSales: { $sum: "$sales" } } } grupuje dokumenty według pola "category" i oblicza łączną sprzedaż dla każdej grupy.

Trzeci etap { $sort: { totalSales: -1 } } sortuje dokumenty według pola "totalSales" w kolejności malejącej.

Czwarty etap { $limit: 5 } ogranicza liczbę dokumentów przekazanych do następnego etapu tylko do pierwszej 5.

W związku z tym potok zwróci 5 pierwszych kategorii według łącznej sprzedaży dla określonego zakresu dat.

Następne kroki