MongoDB Aggregations Brug af Java

1. Oversigt

I denne vejledning tager vi et dyk ind i MongoDB Aggregation framework ved hjælp af MongoDB Java-driveren.

Vi ser først på, hvad sammenlægning betyder konceptuelt, og derefter opretter vi et datasæt. Endelig får vi se forskellige aggregeringsteknikker i aktion ved hjælp af Aggregates builder.

2. Hvad er aggregationer?

Aggregationer bruges i MongoDB til at analysere data og udlede meningsfuld information ud af det.

Disse udføres normalt i forskellige faser, og faserne danner en rørledning - sådan at output fra et trin videregives som input til næste trin.

De mest anvendte trin kan sammenfattes som:

SceneSQL-ækvivalentBeskrivelse
projektVÆLGvælger kun de krævede felter, kan også bruges til at beregne og føje afledte felter til samlingen
matchHVORfiltrerer samlingen efter specificerede kriterier
gruppeGROUP BYsamler input sammen i henhold til de angivne kriterier (f.eks. tælle, summe) for at returnere et dokument for hver særskilt gruppering
sortereBESTIL BYsorterer resultaterne i stigende eller faldende rækkefølge for et givet felt
tælleTÆLLEtæller de dokumenter, samlingen indeholder
begrænseBEGRÆNSEbegrænser resultatet til et specificeret antal dokumenter i stedet for at returnere hele samlingen
udVÆLG I NEW_TABLEskriver resultatet til en navngivet samling; denne fase er kun acceptabel som den sidste i en pipeline

SQL-ækvivalent for hvert aggregationstrin er inkluderet ovenfor for at give os en idé om, hvad den nævnte operation betyder i SQL-verdenen.

Vi ser kort på Java-kodeeksempler for alle disse faser. Men før det har vi brug for en database.

3. Databaseopsætning

3.1. Datasæt

Det første og vigtigste krav for at lære noget database-relateret er selve datasættet!

Med henblik på denne vejledning bruger vi et offentligt tilgængeligt afslappende API-slutpunkt, der giver omfattende information om alle verdens lande. Denne API giver os en masse datapunkter for et land i et praktisk JSON-format. Nogle af de felter, som vi vil bruge i vores analyse, er:

  • navn - landets navn for eksempel, Amerikas Forenede Stater
  • alpha3Code - en kortkode til landets navn for eksempel, IND (for Indien)

  • område - regionen, landet tilhører for eksempel, Europa
  • areal - landets geografiske område
  • Sprog - officielle sprog i landet i en matrixformat; for eksempel, engelsk
  • grænser - en række nabolande alpha3Codes

Lad os nu se hvordan man konverterer disse data til en samling i en MongoDB-database.

3.2. Import til MongoDB

Først skal vi hit API-slutpunktet for at hente alle lande og gemme svaret lokalt i en JSON-fil. Det næste trin er at importere det til MongoDB ved hjælp af Mongoimport kommando:

mongoimport.exe --db --collection --fil --jsonArray

En vellykket import skulle give os en samling med 250 dokumenter.

4. Samleprøver i Java

Nu hvor vi har dækket baserne, lad os komme ind udlede nogle meningsfulde indsigter fra de data, vi har for alle lande. Vi bruger flere JUnit-tests til dette formål.

Men inden vi gør det, skal vi oprette forbindelse til databasen:

@BeforeClass offentlig statisk ugyldig setUpDB () kaster IOException {mongoClient = MongoClients.create (); database = mongoClient.getDatabase (DATABASE); collection = database.getCollection (COLLECTION); } 

I alle de følgende eksempler, vi bruger Aggregater hjælperklasse leveret af MongoDB Java-driveren.

For bedre læsbarhed af vores uddrag kan vi tilføje en statisk import:

importer statisk com.mongodb.client.model.Aggregates. *;

4.1. match og tælle

Lad os starte med noget simpelt. Tidligere bemærkede vi, at datasættet indeholder information om sprog.

Lad os sige, at vi vil tjek antallet af lande i verden, hvor engelsk er et officielt sprog:

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

Her bruger vi to faser i vores aggregeringspipeline: match og tælle.

Først filtrerer vi samlingen ud for kun at matche de dokumenter, der indeholder engelsk i deres Sprog Mark. Disse dokumenter kan forestilles som en midlertidig eller mellemliggende samling, der bliver input til vores næste fase, tælle. Dette tæller antallet af dokumenter i den foregående fase.

Et andet punkt at bemærke i denne prøve er brugen af ​​metoden først. Da vi ved, at output fra sidste fase, tælle, bliver en enkelt post, dette er en garanteret måde at udtrække det ensomme resulterende dokument ud.

4.2. gruppe (med sum) og sortere

I dette eksempel er vores mål at find ud af det geografiske område, der indeholder det maksimale antal lande:

@Test offentligt ugyldigt givenCountryCollection_whenCountedRegionWise_thenMaxInAfrica () {Document maxCountriedRegion = collection.aggregate (Arrays.asList (group ("$ region", Accumulators.sum ("tally", 1)), sort (Sorts. Faldende ("tally")) ).først(); assertTrue (maxCountriedRegion.containsValue ("Afrika")); }

Som det er tydeligt, vi bruger gruppe og sortere for at nå vores mål her.

For det første samler vi antallet af lande i hver region ved at akkumulere en sum af deres forekomster i en variabel stemme. Dette giver os en mellemliggende samling af dokumenter, der hver indeholder to felter: regionen og antallet af lande i den. Derefter sorterer vi det i faldende rækkefølge og udtrækker det første dokument for at give os regionen med maksimale lande.

4.3. sortere,begrænse, og ud

Lad os nu bruge det sortere, begrænse og ud at udvinde de syv største lande områdemæssigt og skrive dem i en ny samling:

@Test offentlig ugyldighed givenCountryCollection_whenAreaSortedDescending_thenSuccess () {collection.aggregate (Arrays.asList (sort (Sorts.descending ("area")), limit (7), out ("largest_seven")). ToCollection (); MongoCollection largestSeven = database.getCollection ("største_seven"); assertEquals (7, largestSeven.countDocuments ()); Dokument usa = størsteSeven.find (Filters.eq ("alpha3Code", "USA")). Første (); assertNotNull (usa); }

Her sorterede vi først den givne samling i faldende rækkefølge af areal. Derefter brugte vi Samlet antal grænser metode til kun at begrænse resultatet til syv dokumenter. Endelig brugte vi ud fase for at deserialisere disse data til en ny samling kaldet største_seven. Denne samling kan nu bruges på samme måde som enhver anden - for eksempel til finde hvis den indeholder USA.

4.4. projekt, gruppe (med max), match

Lad os i vores sidste prøve prøve noget sværere. Sig, at vi har brug for det find ud af, hvor mange grænser hvert land deler med andre, og hvad der er det maksimale antal.

Nu i vores datasæt har vi en grænser felt, som er en matrixliste alpha3Codes for alle landene i nationen, men der er ikke noget felt, der direkte giver os optællingen. Så vi bliver nødt til at udlede antallet af grænser op til lande ved brug af projekt:

@Test offentlig ugyldighed givenCountryCollection_whenNeighborsCalculated_thenMaxIsFifteenInChina () {Bson borderingCountriesCollection = projekt (Projections.fields (Projections.excludeId (), Projections.include ("name"), Projections.computed ("borderingCountries", Projections " $ grænser ")))); int maxValue = collection.aggregate (Arrays.asList (grensingCountriesCollection, group (null, Accumulators.max ("max", "$ bordereringCountries")))) .first (). getInteger ("max"); assertEquals (15, maxValue); Dokument maxNeighboredCountry = collection.aggregate (Arrays.asList (borderingCountriesCollection, match (Filters.eq ("grænsendeCountries", maxValue))). Første (); assertTrue (maxNeighboredCountry.containsValue ("Kina")); }

Derefter, som vi så før, vil vi gruppe den forventede samling for at finde maks Værdi af grænser op til lande. En ting at påpege her er, at det maks akkumulator giver os den maksimale værdi som et tal, ikke hele Dokument indeholdende den maksimale værdi. Vi skal udføre match for at filtrere det ønskede ud Dokument hvis der skal udføres yderligere operationer.

5. Konklusion

I denne artikel så vi det hvad er MongoDB-aggregeringer, og hvordan man anvender dem i Java ved hjælp af et eksempel på datasæt.

Vi brugte fire prøver til at illustrere de forskellige sammenlægningstrin for at danne en grundlæggende forståelse af konceptet. Der er mange muligheder for dataanalyse, som denne ramme tilbyder, som kan udforskes nærmere.

For yderligere læsning giver Spring Data MongoDB en alternativ måde at håndtere fremskrivninger og aggregeringer i Java på.

Som altid er kildekoden tilgængelig på GitHub.


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