MongoDB-aggregasjoner ved bruk av Java

1. Oversikt

I denne opplæringen tar vi et dykk inn i MongoDB Aggregation framework ved hjelp av MongoDB Java-driveren.

Vi skal først se på hva aggregering betyr konseptuelt, og deretter sette opp et datasett. Til slutt får vi se ulike aggregeringsteknikker i aksjon ved hjelp av Aggregates builder.

2. Hva er aggregasjoner?

Aggregasjoner brukes i MongoDB for å analysere data og utlede meningsfull informasjon ut av det.

Disse utføres vanligvis i forskjellige stadier, og trinnene danner en rørledning - slik at utgangen fra ett trinn videreføres som input til neste trinn.

De mest brukte trinnene kan oppsummeres som:

SceneSQL-ekvivalentBeskrivelse
prosjektÅ VELGEvelger bare de obligatoriske feltene, kan også brukes til å beregne og legge til avledede felt i samlingen
kampHVORfiltrerer samlingen i henhold til spesifiserte kriterier
gruppeGRUPPE AVsamler innspill sammen i henhold til de angitte kriteriene (f.eks. telle, summe) for å returnere et dokument for hver enkelt gruppering
sortereREKKEFØLGE ETTERsorterer resultatene i stigende eller fallende rekkefølge for et gitt felt
telleTELLEteller dokumentene samlingen inneholder
grenseGRENSEbegrenser resultatet til et spesifisert antall dokumenter, i stedet for å returnere hele samlingen
uteVELG I NEW_TABLEskriver resultatet til en navngitt samling; denne fasen er bare akseptabel som den siste i en rørledning

SQL-ekvivalent for hvert aggregasjonstrinn er inkludert ovenfor for å gi oss en ide om hva den nevnte operasjonen betyr i SQL-verdenen.

Vi ser på Java-kodeeksempler for alle disse trinnene om kort tid. Men før det trenger vi en database.

3. Databaseoppsett

3.1. Datasett

Det første og viktigste kravet for å lære noe databaserelatert er selve datasettet!

For formålet med denne veiledningen bruker vi et offentlig tilgjengelig avslappende API-endepunkt som gir omfattende informasjon om alle landene i verden. Denne API-en gir oss mange datapunkter for et land i et praktisk JSON-format. Noen av feltene vi skal bruke i analysen vår er:

  • Navn - navnet på landet; for eksempel, Amerikas forente stater
  • alpha3Code - en kort kode for landets navn; for eksempel, IND (for India)

  • region - regionen landet tilhører; for eksempel, Europa
  • område - det geografiske området i landet
  • språk - offisielle språk i landet i et arrayformat; for eksempel, Engelsk
  • grenser - en rekke naboland alpha3Codes

La oss nå se hvordan du konverterer disse dataene til en samling i en MongoDB-database.

3.2. Importerer til MongoDB

Først må vi treff API-endepunktet for å få alle land og lagre svaret lokalt i en JSON-fil. Neste trinn er å importere det til MongoDB ved hjelp av Mongoimport kommando:

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

Vellykket import skal gi oss en samling med 250 dokumenter.

4. Samleprøver i Java

Nå som vi har dekket basene, la oss komme inn på det henter noen meningsfulle innsikter fra dataene vi har for alle landene. Vi bruker flere JUnit-tester for dette formålet.

Men før vi gjør det, må vi koble til databasen:

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

I alle eksemplene som følger, vi bruker Aggregater hjelperklasse levert av MongoDB Java-driveren.

For bedre lesbarhet av utdragene våre, kan vi legge til en statisk import:

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

4.1. kamp og telle

Til å begynne med, la oss starte med noe enkelt. Tidligere bemerket vi at datasettet inneholder informasjon om språk.

La oss si at vi vil sjekk antall land i verden der engelsk er et offisielt språk:

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

Her bruker vi to trinn i vår aggregeringsrørledning: kamp og telle.

Først filtrerer vi ut samlingen slik at den bare samsvarer med de dokumentene som inneholder Engelsk i deres språk felt. Disse dokumentene kan forestilles som en midlertidig eller mellomliggende samling som blir innspill til neste trinn, telle. Dette teller antall dokumenter i forrige trinn.

Et annet poeng å merke seg i dette eksemplet er bruken av metoden først. Siden vi vet at produksjonen fra siste trinn, telle, kommer til å være en enkelt plate, dette er en garantert måte å trekke ut det ensomme resulterende dokumentet.

4.2. gruppe (med sum) og sortere

I dette eksemplet er vårt mål å finn ut den geografiske regionen som inneholder maksimalt antall land:

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

Som det er tydelig, vi bruker gruppe og sortere for å nå vårt mål her.

Først samler vi antall land i hver region ved å samle a sum av deres forekomster i en variabel opptelling. Dette gir oss en mellomliggende samling av dokumenter, som hver inneholder to felt: regionen og antall land i den. Deretter sorterer vi det i synkende rekkefølge og trekker ut det første dokumentet for å gi oss regionen med maksimale land.

4.3. sortere,grense, og ute

La oss nå bruke sortere, grense og ute å trekke ut de syv største landene områdemessig og skrive dem inn i en ny samling:

@Test offentlig ugyldig 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 sorterte vi først den gitte samlingen i fallende rekkefølge av område. Så brukte vi Aggregater # grense metode for å begrense resultatet til bare syv dokumenter. Til slutt brukte vi ute scenen for å deserialisere disse dataene til en ny samling kalt største_seven. Denne samlingen kan nå brukes på samme måte som alle andre - for eksempel til finne hvis den inneholder USA.

4.4. prosjekt, gruppe (med maks), kamp

I vårt siste utvalg, la oss prøve noe vanskeligere. Si at vi trenger det finn ut hvor mange grenser hvert land deler med andre, og hva er det maksimale antallet.

Nå i datasettet vårt har vi en grenser felt, som er en matriseliste alpha3Codes for alle nabolandene, men det er ikke noe felt som gir oss tellingen direkte. Så vi må utlede antall grenser til land ved hjelp av prosjekt:

@Test offentlig ugyldig givenCountryCollection_whenNeighborsCalculated_thenMaxIsFifteenInChina () {Bson borderingCountriesCollection = prosjekt (Projections.fields (Projections.excludeId (), Projections.include ("name"), Projections.computed ("borderingCountries", Projections " $ grenser ")))); 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 (grensingCountriesCollection, match (Filters.eq ("grensingCountries", maxValue))). Første (); assertTrue (maxNeighboredCountry.containsValue ("Kina")); }

Etter det, som vi så før, vil vi gruppe den projiserte samlingen for å finne maks verdien av grenser til land. En ting å påpeke her er at de maks akkumulator gir oss maksimal verdi som et tall, ikke hele Dokument inneholder maksimumsverdien. Vi må prestere kamp for å filtrere ut ønsket Dokument hvis ytterligere operasjoner skal utføres.

5. Konklusjon

I denne artikkelen så vi hva er MongoDB-aggregasjoner, og hvordan du bruker dem i Java ved hjelp av et eksempel på datasett.

Vi brukte fire eksempler for å illustrere de ulike aggregasjonsstadiene for å danne en grunnleggende forståelse av konseptet. Det er mange muligheter for dataanalyse som dette rammeverket tilbyr, som kan utforskes nærmere.

For videre lesing gir Spring Data MongoDB en alternativ måte å håndtere projeksjoner og aggregeringer på Java.

Som alltid er kildekoden tilgjengelig på GitHub.


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