MongoDB agregacije korištenjem Jave

1. Pregled

U ovom uputstvu zaronit ćemo u MongoDB Aggregation framework pomoću MongoDB Java pokretačkog programa.

Prvo ćemo pogledati što agregiranje konceptualno znači, a zatim postaviti set podataka. Napokon ćemo vidjeti različite tehnike agregacije u akciji pomoću agregata graditelja.

2. Što su agregacije?

Agregacije se koriste u MongoDB-u za analizu podataka i izvlačenje značajnih informacija iz njih.

Obično se izvode u različitim fazama, a faze tvore cjevovod - takav da se izlaz jedne faze prenosi kao ulaz u sljedeću fazu.

Najčešće korištene faze mogu se sažeti kao:

ScenaSQL ekvivalentOpis
projektODABERIodabire samo potrebna polja, također se može koristiti za izračunavanje i dodavanje izvedenih polja u zbirku
podudaranjeGDJEfiltrira zbirku prema navedenim kriterijima
skupinaGRUPIRAJ POokuplja podatke prema navedenim kriterijima (npr. brojanje, zbroj) kako bi vratio dokument za svako zasebno grupiranje
vrstaNARUČITE POsortira rezultate u rastućem ili silaznom redoslijedu određenog polja
računatiRAČUNATIbroji dokumente koje zbirka sadrži
ograničitiOGRANIČITIograničava rezultat na određeni broj dokumenata, umjesto da vrati cijelu zbirku
vanODABERITE U NEW_TABLEzapisuje rezultat u imenovanu zbirku; ova je faza prihvatljiva samo kao posljednja u cjevovodu

SQL ekvivalent za svaku fazu agregacije gore je uključen da bi nam dao ideju što spomenuta operacija znači u SQL svijetu.

Uskoro ćemo pogledati uzorke Java koda za sve ove faze. Ali prije toga trebamo bazu podataka.

3. Postavljanje baze podataka

3.1. Skup podataka

Prvi i najvažniji uvjet za učenje bilo čega što se tiče baze podataka je sam skup podataka!

U svrhu ovog vodiča koristit ćemo javno dostupnu krajnju točku API-ja koja pruža sveobuhvatne informacije o svim zemljama svijeta. Ovaj API daje nam puno podataka za zemlju u prikladnom JSON formatu. Neka od polja koja ćemo koristiti u našoj analizi su:

  • Ime - naziv države; na primjer, Sjedinjene Američke Države
  • alfa3Kod - kratki kôd za naziv države; na primjer, IND (za Indiju)

  • regija - regija kojoj zemlja pripada; na primjer, Europa
  • područje - zemljopisno područje zemlje
  • Jezici - službeni jezici zemlje u formatu polja; na primjer, Engleski
  • granice - niz susjednih zemalja ' alfa3Kods

Sad da vidimo kako pretvoriti ove podatke u zbirku u MongoDB bazi podataka.

3.2. Uvoz u MongoDB

Prvo, trebamo pogodite krajnju točku API-ja da biste dobili sve zemlje i lokalno spremili odgovor u JSON datoteku. Sljedeći korak je uvoz u MongoDB pomoću mongoimport naredba:

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

Uspješan uvoz trebao bi nam dati zbirku s 250 dokumenata.

4. Uzorci agregiranja u Javi

Sad kad imamo pokrivene baze, krenimo izvodeći neke značajne uvide iz podataka koje imamo za sve zemlje. U tu svrhu upotrijebit ćemo nekoliko JUnit testova.

Ali prije nego što to učinimo, moramo uspostaviti vezu s bazom podataka:

@BeforeClass javna statička praznina setUpDB () baca IOException {mongoClient = MongoClients.create (); baza podataka = mongoClient.getDatabase (BAZA PODATAKA); collection = baza podataka.getCollection (COLLECTION); } 

U svim primjerima koji slijede, koristit ćemo Agregati pomoćnu klasu koju pruža MongoDB Java upravljački program.

Za bolju čitljivost naših isječaka možemo dodati statički uvoz:

uvezi statički com.mongodb.client.model.Aggregates. *;

4.1. podudaranje i računati

Za početak započnimo s nečim jednostavnim. Ranije smo primijetili da skup podataka sadrži informacije o jezicima.

Sad, recimo da želimo provjerite broj zemalja na svijetu u kojima je engleski službeni jezik:

@Test javna praznina givenCountryCollection_whenEnglishSpeakingCountriesCount_thenNinetyOne () {Document englishSpeakingCountries = collection.aggregate (Arrays.asList (match (Filters.eq ("languages.name", "English")), count ())). First (); assertEquals (91, englishSpeakingCountries.get ("count")); }

Ovdje koristimo dvije faze u našem agregacijskom cjevovodu: podudaranje i računati.

Prvo filtriramo zbirku tako da odgovara samo onim dokumentima koji sadrže Engleski u njihovoj Jezici polje. Ti se dokumenti mogu zamisliti kao privremena ili srednja zbirka koja postaje ulaz za našu sljedeću fazu, računati. Ovo broji broj dokumenata u prethodnoj fazi.

Sljedeća točka koju treba primijetiti u ovom uzorku je uporaba metode prvi. Budući da znamo da je rezultat posljednje faze, računati, bit će jedan zapis, ovo je zajamčeni način izdvajanja usamljenog rezultirajućeg dokumenta.

4.2. skupina (s iznos) i vrsta

U ovom primjeru, naš je cilj saznajte geografsku regiju koja sadrži maksimalan broj zemalja:

@Test javna praznina givenCountryCollection_whenCountRegionWise_thenMaxInAfrica () {Document maxCountriedRegion = collection.aggregate (Arrays.asList (group ("$ region", Accumulators.sum ("tally", 1)), sort (Sorts.descending) " ).prvi(); assertTrue (maxCountriedRegion.containsValue ("Afrika")); }

Kao što je vidljivo, koristimo skupina i vrsta da ovdje postignemo svoj cilj.

Prvo, skupljamo broj zemalja u svakoj regiji akumulirajući a iznos njihovih pojava u varijabli raboš. To nam daje srednju zbirku dokumenata, od kojih svaki sadrži dva polja: regiju i popis zemalja u njoj. Zatim ga sortiramo u opadajućem redoslijedu i izdvajamo prvi dokument kako bismo dobili regiju s najviše zemalja.

4.3. vrsta,ograničiti, i van

Sada se poslužimo vrsta, ograničiti i van izdvojiti sedam najvećih zemalja s područja područja i zapisati ih u novu zbirku:

@Test javna praznina givenCountryCollection_whenAreaSortedDescending_thenSuccess () {collection.aggregate (Arrays.asList (sort (Sorts.descending ("area")), limit (7), out ("greatest_seven"))). ToCollection (); MongoCollection najvećiSeven = baza podataka.getCollection ("najveći_seven"); assertEquals (7, greatestSeven.countDocuments ()); Dokument usa = greatestSeven.find (Filters.eq ("alpha3Code", "USA")). First (); assertNotNull (SAD); }

Ovdje smo najprije sortirali datu kolekciju prema silaznom redoslijedu područje. Zatim smo koristili Agregatno # ograničenje metoda za ograničavanje rezultata na samo sedam dokumenata. Konačno, koristili smo van faza za deserializaciju ovih podataka u novu zbirku koja se zove najveći_sedam. Ova se zbirka sada može koristiti na isti način kao i bilo koja druga - na primjer, za pronaći ako sadrži SAD.

4.4. projekt, grupa (s max), utakmica

U našem posljednjem uzorku, pokušajmo nešto nezgodnije. Reci da trebamo saznajte koliko granica svaka država dijeli s drugima i koji je maksimalan takav broj.

Sada u našem skupu podataka imamo granice polje, što je popis polja alfa3Kods za sve granične zemlje, ali ne postoji nijedno polje koje nam izravno daje brojanje. Stoga ćemo morati izvesti broj borderingCountries koristeći projekt:

@Test javna praznina givenCountryCollection_whenNeighborsCalculated_thenMaxIsFifteenInChina () {Bson borderingCountriesCollection = project (Projections.fields (Projections.excludeId (), Projections.include ("name"), Projections.computed ("bordering $ount.computed," bordering $ount.com, ", bordering $ount $ granice ")))); int maxValue = collection.aggregate (Arrays.asList (borderingCountriesCollection, group (null, Accumulators.max ("max", "$ borderingCountries")))) .first (). getInteger ("max"); assertEquals (15, maxValue); Dokument maxNeighboredCountry = collection.aggregate (Arrays.asList (borderingCountriesCollection, match (Filters.eq ("borderingCountries", maxValue)))). First (); assertTrue (maxNeighboredCountry.containsValue ("Kina")); }

Nakon toga, kao što smo prije vidjeli, hoćemo skupina projicirana zbirka za pronalaženje maks vrijednost borderingCountries. Ovdje treba istaknuti jednu stvar the maks akumulator daje nam maksimalnu vrijednost kao broj, ne cijelu Dokument koja sadrži maksimalnu vrijednost. Moramo nastupiti podudaranje za filtriranje željenog Dokument ako će se izvoditi bilo kakve daljnje operacije.

5. Zaključak

U ovom smo članku vidjeli što su MongoDB agregacije i kako ih primijeniti u Javi pomoću primjera skupa podataka.

Koristili smo četiri uzorka za ilustraciju različitih faza agregacije kako bismo oblikovali osnovno razumijevanje koncepta. Postoji petnaest mogućnosti za analitiku podataka koje ovaj okvir nudi i koje se mogu dalje istraživati.

Za daljnje čitanje, Spring Data MongoDB pruža alternativni način za obradu projekcija i agregacija u Javi.

Kao i uvijek, izvorni kod dostupan je na GitHub-u.


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