Kódím.cz
5

Agregace

Agregace dat v Mongo DB

Agregace

Zkusme si nyní vytvořit nějaké složitější dotazy. Důležitou operací, kterou s daty často provádíme, je řazení. Pro řazení potřebujeme zařídit dvě věci.

První z nich je index. Index si můžeme představit jako datovou strukturu, která usnadňuje vyhledávání a další práci s hodnotami. Index vytvoříme poměrně jednoduše, a to s využitím metody create_index(). U indexu musíme specifikovat, pro který klíč má být vytvořen. Pokud například chceme seřadit nákupy podle klíče "Částka v korunách", vytvoříme index následujícím způsobem.

kolekce = databaze["nakupy"]
kolekce.create_index("Částka v korunách")

U větších kolekcí může vytvoření indexu trvat delší dobu. Vytváření indexu může pokračovat i chvíli poté, co skript skončí, v takovém případě je potřeba počkat na vytvoření kompletního indexu.

Dále potřebujeme vytvořit pipeline. To je seznam (přeneseně i doslova) kroků, které chceme provést. My do seznamu vložíme pouze jeden krok, a to řazení. Každý krok zadáváme jako slovník. Vytvoříme slovník, který má jako klíč operátor "$sort" (operátor pro řazení). Hodnotou klíče je opět slovník, kam vložíme klíč, podle kterého chceme řadit, a hodnotou je pymongo.ASCENDING nebo pymongo.DESCENDING podle toho, zda chceme řadit vzestupně či sestupně.

Pro větší přehlednost si krok uložíme do samostatné proměnné krokRazeni. Po vytvoření pipeline zavoláme metodu aggregate, která provede všechny kroky (v našem případě jeden) a výsledek tradičně uložíme do proměnné vysledek.

krokRazeni = {
    "$sort": {
        "Částka v korunách": pymongo.DESCENDING
    }
}

pipeline = [
    krokRazeni
]
vysledek = kolekce.aggregate(pipeline)
for dokument in vysledek:
    print(dokument)

Nyní vytvoříme spojení do skupiny (group). U spojení více řádků do skupin potřebujeme říci, podle jakého klíče vytvoříme skupiny. Pokud bychom chtěli zjistit, kolik každý ze spolubydlících utratil za nákupy, vytvoříme skupiny podle sloupce Jméno. Dále vytvoříme nový klíč Celkem utraceno, jehož hodnota bude součet všech nákupů v rámci dané skupiny. Samotné spuštění pipeline je již stejné.

kolekce = databaze["nakupy"]

krokSoucetNakladu = {
   "$group": {
         "_id": "$Jméno",
         "Celkem utraceno": { "$sum": "$Částka v korunách" }, 
   }
}

pipeline = [
   krokSoucetNakladu,
]

vysledek = kolekce.aggregate(pipeline)
for dokument in vysledek:
    print(dokument)

Nyní si zkusíme vytvořit pipeline se dvěma kroky. Prvním krokem je součet hodnot nákupů jednotlivých spolubydlících. V druhém kroku seřadíme spolubydlící dle celkové útraty od nejvíce po nejméně utrácejícího.

kolekce = databaze["nakupy"]
krokSoucetNakladu = {
    "$group": {
        "_id": "$Jméno",
        "Celkem utraceno": {"$sum": "$Částka v korunách"},
    }
}
krokRazeni = {
    "$sort": {
        "Celkem utraceno": pymongo.DESCENDING
    }
}

pipeline = [
    krokSoucetNakladu,
    krokRazeni
]

vysledek = kolekce.aggregate(pipeline)
for dokument in vysledek:
    print(dokument)