Agregácie MongoDB pomocou Java

1. Prehľad

V tomto výučbe sa ponoríme do Rámec agregácie MongoDB pomocou ovládača Java MongoDB.

Najprv sa pozrieme na to, čo agregácia znamená koncepčne, a potom nastavíme množinu údajov. Nakoniec uvidíme rôzne agregačné techniky v akcii pomocou nástroja Aggregates builder.

2. Čo sú to agregácie?

Agregácie sa v MongoDB používajú na analýzu údajov a odvodzujú z nich zmysluplné informácie.

Spravidla sa vykonávajú v rôznych fázach a fázy tvoria kanál - taký, že výstup z jedného stupňa sa prenáša ako vstup do ďalšieho stupňa.

Najčastejšie používané etapy možno zhrnúť ako:

EtapaEkvivalent SQLPopis
projektVYBERTEvyberie iba povinné polia, dá sa použiť aj na výpočet a pridanie odvodených polí do kolekcie
zápasKDEfiltruje zbierku podľa zadaných kritérií
skupinaSKUPINA PODĽAzhromažďuje vstupy podľa zadaných kritérií (napr. počet, súčet), aby vrátil dokument pre každé odlišné zoskupenie
triediťZORADIŤ PODĽAtriedi výsledky vzostupne alebo zostupne podľa daného poľa
počítaťCOUNTpočíta dokumenty, ktoré zbierka obsahuje
limitLIMITobmedzuje výsledok na zadaný počet dokumentov namiesto vrátenia celej zbierky
vonVYBERTE DO NOVEJ TABUĽKYzapíše výsledok do pomenovanej zbierky; táto fáza je prijateľná iba ako posledná v príprave

Ekvivalent SQL pre každú fázu agregácie je zahrnutý vyššie, aby sme získali predstavu o tom, čo uvedená operácia znamená vo svete SQL.

Čoskoro sa pozrieme na ukážky kódu Java pre všetky tieto fázy. Ale predtým potrebujeme databázu.

3. Nastavenie databázy

3.1. Množina údajov

Prvou a najdôležitejšou požiadavkou na učenie sa čohokoľvek, čo súvisí s databázou, je samotný súbor údajov!

Na účely tohto tutoriálu použijeme verejne dostupný koncový bod API, ktorý poskytuje komplexné informácie o všetkých krajinách sveta. Toto API nám poskytuje veľa dátových bodov pre krajinu vo vhodnom formáte JSON. Niektoré z polí, ktoré použijeme v našej analýze, sú:

  • názov - názov krajiny; napríklad, Spojené štáty americké
  • alpha3Code - skratka pre názov krajiny; napríklad, IND (pre Indiu)

  • regiónu - región, do ktorého krajina patrí; napríklad, Európe
  • oblasti - zemepisná oblasť krajiny
  • jazykoch - úradné jazyky krajiny vo formáte poľa; napríklad, Angličtina
  • hranice - rad susedných krajín “ alpha3Codes

Teraz sa pozrime ako previesť tieto údaje do kolekcie v databáze MongoDB.

3.2. Importuje sa do MongoDB

Najprv musíme stlačte koncový bod API, aby ste získali všetky krajiny, a uložte odpoveď lokálne do súboru JSON. Ďalším krokom je import do MongoDB pomocou mongoimport príkaz:

mongoimport.exe --db --collection --file --jsonArray

Úspešný import by nám mal poskytnúť kolekciu s 250 dokumentmi.

4. Agregačné vzorky v Jave

Teraz, keď máme zakryté základy, poďme do toho odvodením niektorých zmysluplných poznatkov z údajov, ktoré máme k dispozícii pre všetky krajiny. Na tento účel použijeme niekoľko testov JUnit.

Ale predtým, ako to urobíme, musíme sa pripojiť k databáze:

@BeforeClass public static void setUpDB () vyvolá IOException {mongoClient = MongoClients.create (); database = mongoClient.getDatabase (DATABASE); kolekcia = database.getCollection (COLLECTION); } 

Vo všetkých nasledujúcich príkladoch budeme používať Agregáty pomocná trieda poskytovaná ovládačom MongoDB Java.

Pre lepšiu čitateľnosť našich úryvkov môžeme pridať statický import:

importovať statický com.mongodb.client.model.Aggregates. *;

4.1. zápas a počítať

Na začiatok začnime niečím jednoduchým. Predtým sme si všimli, že množina údajov obsahuje informácie o jazykoch.

Teraz, povedzme, že chceme Skontrolujte počet krajín na svete, v ktorých je angličtina úradným jazykom:

@Test public void givenCountryCollection_whenEnglishSpeakingCountriesCounted_thenNinetyOne () {dokument englishSpeakingCountries = collection.aggregate (Arrays.asList (match (Filters.eq ("languages.name", "English")), count ())). First (); assertEquals (91, englishSpeakingCountries.get ("count")); }

V našom agregačnom potrubí používame dve fázy: zápas a počítať.

Najskôr kolekciu odfiltrujeme, aby zodpovedala iba dokumentom, ktoré obsahujú Angličtina v ich jazykoch lúka. Tieto dokumenty si môžeme predstaviť ako dočasnú alebo priebežnú zbierku, ktorá sa stane vstupom pre našu ďalšiu fázu, počítať. Týmto sa počíta počet dokumentov v predchádzajúcej fáze.

Ďalším bodom, ktorý je potrebné v tejto vzorke poznamenať, je použitie metódy najprv. Pretože vieme, že výstup z poslednej fázy, počítať, bude jeden záznam, toto je zaručený spôsob, ako extrahovať osamelý výsledný dokument.

4.2. skupina (s súčet) a triediť

V tomto príklade je naším cieľom: zistite geografický región obsahujúci maximálny počet krajín:

@Test public void givenCountryCollection_whenCountedRegionWise_thenMaxInAfrica () {dokument maxCountriedRegion = collection.aggregate (Arrays.asList (group ("$ region", Accumulators.sum ("tally", 1)), sort (Sorts.descending ("tally"))) ).najprv(); assertTrue (maxCountriedRegion.containsValue ("Afrika")); }

Ako je zrejmé, používame skupina a triediť aby sme tu dosiahli náš cieľ.

Najskôr zhromaždíme počet krajín v každom regióne zhromaždením a súčet ich výskytov v premennej záznam. Získame tak priebežnú zbierku dokumentov, z ktorých každá obsahuje dve polia: región a súpis krajín. Potom ho zoradíme zostupne a extrahujeme prvý dokument, aby sme získali región s maximálnym počtom krajín.

4.3. triediť,limit, a von

Teraz poďme použiť triediť, limit a von extrahovať sedem najväčších krajín z hľadiska oblasti a zapísať ich do novej zbierky:

@Test public void givenCountryCollection_whenAreaSortedDescending_thenSuccess () {collection.aggregate (Arrays.asList (sort (Sorts.descending ("area")), limit (7), out ("největší_seven"))). ToCollection (); MongoCollection největšíSeven = database.getCollection ("najväčší_seven"); assertEquals (7, largerSeven.countDocuments ()); Dokument usa = největšíSeven.find (Filters.eq ("alpha3Code", "USA")). First (); assertNotNull (usa); }

Tu sme najskôr zoradili danú kolekciu v zostupnom poradí od oblasti. Potom sme použili Agregáty # limit metóda na obmedzenie výsledku iba na sedem dokumentov. Nakoniec sme použili von etapa deserializácie týchto údajov do novej kolekcie s názvom najväčší_sedem. Túto kolekciu je teraz možné použiť rovnako ako ktorúkoľvek inú - napríklad na Nájsť ak obsahuje USA.

4.4. projekt, skupina (s max.), zhoda

V našej poslednej ukážke skúsme niečo zložitejšie. Povedzme, že musíme zistite, koľko hraníc zdieľa každá krajina s ostatnými a aký je ich maximálny počet.

Teraz v našom súbore údajov máme hranice pole, čo je zoznam polí alpha3Codes pre všetky susediace krajiny národa, ale neexistuje žiadne pole, ktoré by nám priamo dávalo počet. Takže budeme musieť odvodiť počet hraničné krajiny použitím projekt:

@Test public void givenCountryCollection_whenNe NeighborsCalculated_thenMaxIsFifteenInChina () {Bson borderingCountriesCollection = project (Projections.fields (Projections.excludeId (), Projections.include ("name"), Projections.computed ("borderingCountries" "" $ border ")))); int maxValue = collection.aggregate (Arrays.asList (borderingCountriesCollection, group (null, Accumulators.max ("max", "$ borderingCountries")))) .first (). getInteger ("max"); assertEquals (15, maxValue); Dokument maxNe NeighboredCountry = collection.aggregate (Arrays.asList (borderingCountriesCollection, match (Filters.eq ("borderingCountries", maxValue)))). First (); assertTrue (maxNe NeighboredCountry.containsValue ("Čína")); }

Potom, ako sme už videli predtým, urobíme to skupina plánovaná zbierka na nájdenie max hodnota hraničné krajiny. Tu je potrebné zdôrazniť jednu vec the max akumulátor nám dáva maximálnu hodnotu ako číslo, nie celá Dokument obsahujúca maximálnu hodnotu. Musíme podať výkon zápas odfiltrovať požadované Dokument ak sa majú vykonať nejaké ďalšie operácie.

5. Záver

V tomto článku sme videli čo sú agregácie MongoDB a ako ich použiť v Jave pomocou ukážkovej množiny údajov.

Použili sme štyri vzorky na ilustráciu rôznych stupňov agregácie, aby sme vytvorili základné pochopenie konceptu. Tento rámec ponúka mnoho možností pre dátovú analýzu, ktoré je možné ďalej preskúmať.

Pre ďalšie čítanie poskytuje Spring Data MongoDB alternatívny spôsob spracovania projekcií a agregácií v Jave.

Ako vždy, zdrojový kód je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found