MongoDB összesítések Java használatával

1. Áttekintés

Ebben a bemutatóban elmélyülünk a MongoDB összesítési keretrendszer a MongoDB Java illesztőprogram használatával.

Először megvizsgáljuk, hogy mit jelent az összesítés fogalmilag, majd beállítunk egy adatkészletet. Végül meglátjuk különféle összesítési technikák az Aggregates builder segítségével.

2. Mi az összesítés?

Az összesítéseket a MongoDB-ben használják az adatok elemzésére és értelmes információk levezetésére.

Ezeket általában különböző szakaszokban hajtják végre, és a szakaszok egy csővezetéket alkotnak - oly módon, hogy az egyik szakasz kimenetét továbbadják bemenetként a következő szakaszba.

A leggyakrabban használt szakaszok a következőképpen foglalhatók össze:

SzínpadSQL egyenértékűLeírás
projektSELECTcsak a szükséges mezőket választja ki, felhasználható származtatott mezők kiszámításához és hozzáadásához is
mérkőzésHOLa megadott kritériumok szerint szűri a gyűjteményt
csoportCSOPORTOSÍTösszegyűjti az inputokat a megadott kritériumok szerint (pl. szám, összeg), hogy minden egyes különálló csoport számára visszaküldjön egy dokumentumot
fajtaRENDEZÉSaz eredményeket egy adott mező növekvő vagy csökkenő sorrendjében rendezi
számolSZÁMOLmegszámolja a gyűjteményben lévő dokumentumokat
határHATÁRaz eredményt egy meghatározott számú dokumentumra korlátozza, ahelyett, hogy visszaadná a teljes gyűjteményt
kiKIVÁLASZTÁS A NEW_TABLE-baaz eredményt megnevezett gyűjteménybe írja; ez a szakasz csak egy utolsó szakaszban elfogadható

Az egyes összesítési szakaszok SQL-ekvivalense a fentiekben szerepel, hogy képet kapjunk arról, mit jelent az említett művelet az SQL-világban.

Rövidesen megvizsgáljuk ezeknek a szakaszoknak a Java kódmintáit. De előtte szükségünk van egy adatbázisra.

3. Adatbázis beállítása

3.1. Adatkészlet

Az adatbázisokhoz kapcsolódó ismeretek elsajátításának első és legfontosabb követelménye maga az adatkészlet!

A bemutató céljára egy nyilvánosan elérhető nyugodt API-végpontot fogunk használni, amely átfogó információt nyújt a világ összes országáról. Ez az API sok adatpontot ad egy ország számára, kényelmes JSON formátumban. Néhány elem, amelyet elemzésünk során használni fogunk:

  • név - az ország neve; például, Amerikai egyesült államok
  • alpha3Code - az ország nevének rövid kódja; például, IND (India esetében)

  • vidék - az a régió, amelyhez az ország tartozik; például, Európa
  • terület - az ország földrajzi területe
  • nyelveket - az ország hivatalos nyelvei tömb formátumban; például, angol
  • határok - a szomszédos országok tömbje alpha3Codes

Most nézzük meg hogyan lehet ezeket az adatokat a MongoDB adatbázis gyűjteményévé konvertálni.

3.2. Importálás a MongoDB-be

Először is meg kell nyomja meg az API végpontot az összes ország megszerzéséhez és a válasz helyi mentéséhez JSON fájlban. A következő lépés az importálása a MongoDB-be a mongoimport parancs:

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

A sikeres importálás során 250 dokumentumot tartalmazó gyűjteményt kell adnunk.

4. Összesítési minták Java-ban

Most, hogy az alapokat lefedtük, menjünk bele néhány értelmes felismerést levonva az összes országra vonatkozó adatokból. Erre a célra több JUnit tesztet fogunk használni.

De mielőtt ezt megtennénk, létre kell hoznunk a kapcsolatot az adatbázissal:

@BeforeClass public static void setUpDB () dobja az IOException-t {mongoClient = MongoClients.create (); adatbázis = mongoClient.getDatabase (ADATBÁZIS); gyűjtemény = adatbázis.getCollection (GYŰJTEMÉNY); } 

Az összes következő példában használjuk a Összesítések segítő osztály, amelyet a MongoDB Java illesztőprogram biztosít.

A kivonatok jobb olvashatósága érdekében statikus importálást adhatunk hozzá:

importáljon statikus com.mongodb.client.model.Aggregates. *;

4.1. mérkőzés és számol

Először is kezdjük valami egyszerűvel. Korábban megjegyeztük, hogy az adatkészlet információkat tartalmaz a nyelvekről.

Most tegyük fel, hogy szeretnénk ellenőrizze a világ azon országainak számát, ahol az angol hivatalos nyelv:

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

Itt két lépést használunk az összesítési folyamatban: mérkőzés és számol.

Először kiszűrjük a gyűjteményt, hogy csak azoknak a dokumentumoknak feleljen meg, amelyek tartalmazzák angol azokban nyelveket terület. Ezeket a dokumentumokat úgy lehet elképzelni, mint egy ideiglenes vagy köztes gyűjteményt, amely a következő szakaszunk alapjává válik, számol. Ez megszámolja az előző szakaszban szereplő dokumentumok számát.

Egy másik szempont, amelyet meg kell jegyezni ebben a mintában, a módszer használata első. Mivel tudjuk, hogy az utolsó szakasz kimenete számol, egyetlen rekord lesz, ez garantált módszer a magányos dokumentum kinyerésére.

4.2. csoport (val vel összeg) és fajta

Ebben a példában az a célunk, hogy megtudja a maximális számú országot tartalmazó földrajzi régiót:

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

Mint nyilvánvaló, használjuk csoport és fajta hogy itt elérjük célunkat.

Először az egyes régiók országainak számát gyűjtjük össze a összeg előfordulásuk változóban megegyezik. Ez közbenső dokumentumgyűjteményt ad nekünk, amelyek mindegyike két mezőt tartalmaz: a régiót és a benne lévő országok összesítését. Ezután csökkenő sorrendbe rendezzük, és kivonjuk az első dokumentumot, amely megadja nekünk azt a régiót, ahol a legtöbb ország van.

4.3. fajta,határ, és ki

Most használjuk fajta, határ és ki hogy területi szempontból kivonja a hét legnagyobb országot, és új gyűjteménybe írja őket:

@Test public void givenCountryCollection_whenAreaSortedDescending_thenSuccess () {collection.aggregate (Arrays.asList (sort (Sorts.descending ("area")), limit (7), out ("legnagyobb_seven"))). ToCollection (); MongoCollection legnagyobbSeven = database.getCollection ("legnagyobb_hét"); assertEquals (7, legnagyobbSeven.countDocuments ()); Dokumentum usa = legnagyobbSeven.find (Filters.eq ("alpha3Code", "USA")). Először (); assertNotNull (USA); }

Itt rendeztük először az adott gyűjteményt a csökkenő sorrendben terület. Aztán használtuk a Összesített összeg # korlát módszer, amely az eredményt csak hét dokumentumra korlátozza. Végül a ki szakaszban deserializálják ezeket az adatokat egy ún legnagyobb_hét. Ez a gyűjtemény ma már ugyanúgy használható, mint bármely más - például a megtalálja ha tartalmaz USA.

4.4. projekt, csoport (max), mérkőzés

Legutóbbi mintánkban próbáljunk meg valami trükkösebbet. Mondd, hogy muszáj megtudhatja, hogy az egyes országok hány határon osztoznak másokkal, és mekkora a maximális szám.

Most az adatkészletünkben van egy határok mező, amely egy tömblista alpha3Codes a nemzet minden szomszédos országára, de nincs olyan mező, amely közvetlenül megadná számunkra a számot. Tehát le kell vonnunk a számukat országokkal határos felhasználásával projekt:

@Test public void givenCountryCollection_whenNeighborsCalculated_thenMaxIsFifteenInChina () {Bson borderingCountriesCollection = project (Projections.fields (Projections.excludeId (), Projections.include ("name"), Projections.cludries "" CompoundComputed ("borderingC $ határok ")))); int maxValue = collection.aggregate (Arrays.asList (borderingCountriesCollection, group (null, Accumulators.max ("max", "$ borderingCountries"))))) .first (). getInteger ("max"); assertEquals (15, maxValue); Dokumentum maxNeighboredCountry = collection.aggregate (Arrays.asList (borderingCountriesCollection, match (Filters.eq ("borderingCountries", maxValue))))). First (); assertTrue (maxNeighboredCountry.containsValue ("Kína")); }

Utána, amint azt korábban láttuk, megtesszük csoport a kivetített gyűjtemény, hogy megtalálják a max értéke országokkal határos. Itt egy dologra kell felhívni a figyelmet a max akkumulátor megadja számunkra a maximális értéket, nem pedig az egészet Dokumentum amely a maximális értéket tartalmazza. Teljesítenünk kell mérkőzés hogy kiszűrje a kívánt Dokumentum ha további műveleteket kell végrehajtani.

5. Következtetés

Ebben a cikkben láttuk mik a MongoDB összesítések és hogyan alkalmazhatók Java-ban egy példa adatkészlet segítségével.

Négy mintával szemléltettük a különböző összesítési szakaszokat, hogy megalapozzuk a koncepció alapértelmezését. Ez a keretrendszer rengeteg lehetőséget kínál az adatelemzésre, amelyek tovább vizsgálhatók.

További elolvasás céljából a Spring Data MongoDB egy alternatív módot kínál a vetületek és összesítések Java-ban történő kezelésére.

Mint mindig, a forráskód is elérhető a GitHubon.