Spring Data MongoDB: Projekcije i agregacije

1. Pregled

Spring Data MongoDB pruža jednostavne apstrakcije na visokoj razini na materinji jezik upita MongoDB-a. U ovom članku, istražit ćemo podršku za okvir Projekcije i agregaciju.

Ako ste novi u ovoj temi, pogledajte naš uvodni članak Uvod u Spring Data MongoDB.

2. Projekcija

U MongoDB-u, projekcije su način dohvaćanja samo potrebnih polja dokumenta iz baze podataka. To smanjuje količinu podataka koji se moraju prenijeti s poslužitelja baze podataka na klijenta i time povećava performanse.

S Spring Data MongDB, projekcije se mogu koristiti i sa MongoTemplate i MongoRepository.

Prije nego što krenemo dalje, pogledajmo model podataka koji ćemo koristiti:

@Document javni razred korisnika {@Id private String id; privatni naziv niza; privatno Integer doba; // standardni geteri i postavljači}

2.1. Projekcije pomoću MongoTemplate

The uključiti () i isključiti() metode na Polje klasa koristi se za uključivanje i isključivanje polja, odnosno:

Upit upita = novi upit (); query.fields (). include ("name"). exclude ("id"); Popis john = mongoTemplate.find (upit, User.class);

Te se metode mogu povezati lancima kako bi uključile ili izuzele više polja. Polje označeno kao @Iskaznica (_iskaznica u bazi podataka) uvijek se dohvaća ako nije izričito izuzeto.

Izuzeta polja su null u primjeru klase modela kada se zapisi dohvaćaju projekcijom. U slučaju da su polja primitivnog tipa ili njihove klase omotača, tada su vrijednosti izuzetih polja zadane vrijednosti primitivnih tipova.

Na primjer, Niz bilo bi null, int/Cijeli broj bilo bi 0 i boolean/Booleova bilo bi lažno.

Tako je u gornjem primjeru, Ime polje bi bilo Ivan, iskaznica bilo bi null i dob bilo bi 0.

2.2. Projekcije pomoću MongoRepository

Dok koristite MongoRepositories, polja od @Query napomena se može definirati u JSON formatu:

@Query (value = "{}", fields = "{name: 1, _id: 0}") Popis findNameAndExcludeId ();

Rezultat bi bio isti kao kod korištenja MongoTemplate-a. The vrijednost = "{}" označava nikakve filtre i stoga će se preuzeti svi dokumenti.

3. Zbrajanje

Agregacija u MongoDB izgrađena je za obradu podataka i vraćanje izračunatih rezultata. Podaci se obrađuju u fazama, a izlaz jedne faze daje se kao ulaz u sljedeću fazu. Ova sposobnost primjene transformacija i izračunavanja podataka u fazama čini agregiranje vrlo moćnim alatom za analitiku.

Spring Data MongoDB pruža apstrakciju za nativne upite za agregiranje pomoću tri klase Zbrajanje koji obavija upit za agregiranje, Operacija agregacije koja obavija pojedine faze cjevovoda i Rezultati agregiranja koji je spremnik rezultata dobivenog agregacijom.

Da biste izvršili i agregiranje, prvo stvorite cjevovode za agregiranje koristeći metode statičkog graditelja na Zbrajanje klase, a zatim stvorite instancu Zbrajanje koristiti newAggregation () metoda na Zbrajanje klase i na kraju pokreni agregaciju pomoću MongoTemplate:

MatchOperation matchStage = Aggregation.match (novi Kriteriji ("foo"). Je ("bar")); ProjectionOperation projectStage = Aggregation.project ("foo", "bar.baz"); Agregacijsko agregiranje = Aggregation.newAggregation (matchStage, projectStage); AggregationResults output = mongoTemplate.aggregate (agregacija, "foobar", OutType.class);

Imajte na umu da oboje MatchOperation i ProjectionOperation implementirati Operacija agregacije. Postoje slične implementacije za druge agregacijske cjevovode. OutType je model podataka za očekivani izlaz.

Sada ćemo pogledati nekoliko primjera i njihovih objašnjenja kako bismo pokrili glavne cjevovode i operatore agregacije.

Skup podataka koji ćemo koristiti u ovom članku navodi detalje o svim poštanskim brojevima u SAD-u koji se mogu preuzeti iz spremišta MongoDB.

Pogledajmo uzorak dokumenta nakon uvoza u zbirku tzv patentni zatvarači u test baza podataka.

{"_id": "01001", "city": "AGAWAM", "loc": [-72.622739, 42.070206], "pop": 15338, "state": "MA"}

Radi jednostavnosti i kako bismo kôd bili sažeti, u sljedećim isječcima koda pretpostavit ćemo da svi statički metode Zbrajanje klase su statički uvezene.

3.1. Dobiti sve države s brojem stanovnika većim od 10 milijuna redoslijedom prema opadajućem broju stanovnika

Ovdje ćemo imati tri cjevovoda:

  1. $ grupa faza sumiranja stanovništva svih poštanskih brojeva
  2. $ podudaranje faza za filtriranje država s više od 10 milijuna stanovnika
  3. $ sort faza za sortiranje svih dokumenata u opadajućem redoslijedu populacije

Očekivani izlaz će imati polje _iskaznica kao država i polje državaPop sa ukupnim stanovništvom države. Stvorimo model podataka za to i pokrenimo agregaciju:

public class StatePoulation {@Id private String state; privatni Integer statePop; // standardni geteri i postavljači}

The @Iskaznica napomena će mapirati _iskaznica polje od izlaza do država u modelu:

GroupOperation groupByStateAndSumPop = group ("state") .sum ("pop"). As ("statePop"); MatchOperation filterStates = match (novi kriteriji ("statePop"). Gt (10000000)); SortOperation sortByPopDesc ​​= sortiraj (Sort.by (Direction.DESC, "statePop")); Agregacija agregacije = newAggregation (groupByStateAndSumPop, filterStates, sortByPopDesc); Rezultat agregacijeResulti = mongoTemplate.aggregate (agregacija, "zipovi", StatePopulation.class);

The Rezultati agregiranja razredna oprema Iterativ i stoga ga možemo prelistati i ispisati rezultate.

Ako model izlaznih podataka nije poznat, standardna klasa MongoDB Dokument može se koristiti.

3.2. Dobiti najmanju državu prema prosječnom gradskom stanovništvu

Za ovaj problem trebat će nam četiri faze:

  1. $ grupa da zbrojimo ukupan broj stanovnika svakog grada
  2. $ grupa izračunati prosječnu populaciju svake države
  3. $ sort stupanj za poredak država prema prosječnom gradskom stanovništvu rastućim redoslijedom
  4. Ograničenje od $ dobiti prvu državu s najnižim prosječnim gradskim stanovništvom

Iako to nije nužno potrebno, upotrijebit ćemo dodatni $ projekt faza za formatiranje dokumenta prema izlazu Stanovništvo model podataka.

GroupOperation sumTotalCityPop = group ("država", "grad") .sum ("pop"). As ("cityPop"); GroupOperation averageStatePop = group ("_ id.state") .avg ("cityPop"). As ("avgCityPop"); SortOperation sortByAvgPopAsc = sort (Sort.by (Direction.ASC, "avgCityPop")); LimitOperation limitToOnlyFirstDoc = limit (1); ProjectionOperation projectToMatchModel = project () .andExpression ("_ id"). As ("state") .andExpression ("avgCityPop"). As ("statePop"); Agregacija agregacije = newAggregation (sumTotalCityPop, averageStatePop, sortByAvgPopAsc, limitToOnlyFirstDoc, projectToMatchModel); Rezultat rezultata agregiranja = mongoTemplate .aggregate (agregacija, "zipovi", StatePopulation.class); StatePopulation najmanjiStat = rezultat.getUniqueMappedResult ();

U ovom primjeru već znamo da će u rezultatu biti samo jedan dokument, jer smo u posljednjoj fazi ograničili broj izlaznih dokumenata na 1. Kao takvi, možemo se pozivati getUniqueMappedResult () da biste dobili traženo Stanovništvo primjer.

Još jedna stvar koju treba primijetiti je da, umjesto da se oslanjate na @Iskaznica bilješka na karti _iskaznica da navedemo, mi smo to izričito učinili u fazi projekcije.

3.3. Nabavite državu s maksimalnim i minimalnim poštanskim brojevima

Za ovaj primjer trebamo tri faze:

  1. $ grupa za brojanje broja poštanskih brojeva za svaku državu
  2. $ sort kako bi države uredili prema broju poštanskih brojeva
  3. $ grupa za pronalaženje stanja s max i min poštanskim brojevima pomoću $ prvo i $ zadnji operatora
GroupOperation sumZips = group ("state"). Count (). As ("zipCount"); SortOperation sortByCount = sortiraj (Direction.ASC, "zipCount"); GroupOperation groupFirstAndLast = group (). First ("_ id"). As ("minZipState") .first ("zipCount"). As ("minZipCount"). Last ("_ id"). As ("maxZipState") .last ("zipCount"). as ("maxZipCount"); Agregacija agregacije = newAggregation (sumZips, sortByCount, groupFirstAndLast); Rezultat rezultata agregiranja = mongoTemplate .aggregate (agregacija, "zipovi", Document.class); Dokument dokumenta = rezultat.getUniqueMappedResult ();

Ovdje nismo koristili nijedan model, već smo koristili Dokument već opremljen MongoDB upravljačkim programom.

4. Zaključak

U ovom smo članku naučili kako dohvatiti navedena polja dokumenta u MongoDB pomoću projekcija u Spring Data MongoDB.

Također smo saznali o podršci MongoDB okvira za agregiranje u Spring Data. Pokrili smo glavne faze agregacije - grupiranje, projekt, sortiranje, ograničenje i podudaranje i pogledali neke primjere njegove praktične primjene. Kompletni izvorni kod dostupan je na GitHubu.


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