Tavaszi adatok MongoDB: Vetítések és összesítések

1. Áttekintés

A Spring Data MongoDB egyszerű magas szintű absztrakciókat biztosít a MongoDB natív lekérdezési nyelvén. Ebben a cikkben, feltárjuk a Projections and Aggregation framework támogatását.

Ha még nem ismeri ezt a témát, olvassa el a Bevezetés a tavaszi adatokba MongoDB bevezető cikkünket.

2. Vetítés

A MongoDB-ben a Vetítések segítségével csak a dokumentum szükséges mezőit lehet lekérni az adatbázisból. Ez csökkenti az adatbázis-kiszolgálóról az ügyfélre továbbítandó adatok mennyiségét, és ezáltal növeli a teljesítményt.

A Spring Data MongDB használatával a vetületek mindkettővel használhatók MongoTemplate és MongoRepository.

Mielőtt továbblépnénk, nézzük meg az általunk használt adatmodellt:

@Document public class Felhasználó {@Id private String azonosító; privát karakterlánc neve; magán Egész életkor; // szabványos mérőeszközök és beállítók}

2.1. Vetítések használata MongoTemplate

A tartalmazza () és kizár () módszerek a Terület osztály az mezők beillesztésére és kizárására szolgál:

Lekérdezés = új Lekérdezés (); query.fields (). include ("név"). kizár ("id"); List john = mongoTemplate.find (lekérdezés, Felhasználó.osztály);

Ezek a módszerek összekapcsolhatók több mező beillesztésével vagy kizárásával. A mező így lett jelölve @Id (_id az adatbázisban) mindig be van töltve, hacsak nincs kifejezetten kizárva.

A kizárt mezők nulla a modellosztály példányában, amikor a rekordokat vetítéssel töltik le. Abban az esetben, ha a mezők primitív típusúak, vagy azok burkolóosztályuk, akkor a kizárt mezők értéke a primitív típusok alapértelmezett értéke.

Például, Húr lenne nulla, int/Egész szám lenne 0 és logikai/Logikai lenne hamis.

Így a fenti példában a név mező lenne János, id lenne nulla és kor lenne 0.

2.2. Vetítések használata MongoRepository

A MongoRepositories használata közben a mezők nak,-nek @Lekérdezés az annotáció JSON formátumban definiálható:

@Query (érték = "{}", mezők = "{név: 1, _id: 0}") List findNameAndExcludeId ();

Az eredmény ugyanaz lenne, mint a MongoTemplate használata. A érték = ”{}” nem jelöl szűrőket, ezért az összes dokumentum be lesz töltve.

3. Összesítés

Az MongoDB összesítését az adatok feldolgozására és a kiszámított eredmények visszaadására építették. Az adatokat szakaszokban dolgozzuk fel, és az egyik szakasz kimenetét bemenetként biztosítjuk a következő szakaszhoz. Ez a transzformációk alkalmazásának és az adatok szakaszos kiszámításának képessége az összesítést az analitika nagyon hatékony eszközévé teszi.

A Spring Data MongoDB absztrakciót biztosít a natív összesítési lekérdezésekhez a három osztály felhasználásával Összesítés amely összefoglal egy összesítési lekérdezést, ÖsszesítésMűvelet amely beburkolja az egyes csővezeték szakaszokat és Összesítés eredményei amely az összesítéssel előállított eredmény tárolója.

A teljesítéshez és az összesítéshez először hozzon létre összesítési csővezetékeket a statikus készítő módszerekkel Összesítés osztály, majd hozzon létre egy példányt Összesítés használni a newAggregation () módszer a Összesítés osztály és végül futtassa az összesítést a MongoTemplate:

MatchOperation matchStage = Aggregation.match (új kritériumok ("foo"). Is ("bar")); ProjectionOperation projectStage = Aggregation.project ("foo", "bar.baz"); Összesítés összesítése = Aggregation.newAggregation (matchStage, projectStage); AggregationResults output = mongoTemplate.aggregate (aggregation, "foobar", OutType.class);

Felhívjuk figyelmét, hogy mindkettő MatchOperation és ProjectionOperation megvalósítani ÖsszesítésMűvelet. Hasonló megvalósítások léteznek más összesítő csővezetékekhez is. OutType a várható teljesítmény adatmodellje.

Most megnézünk néhány példát és azok magyarázatait, amelyek a főbb aggregációs csővezetékekre és üzemeltetőkre vonatkoznak.

Az ebben a cikkben használt adatkészlet felsorolja az Egyesült Államok összes irányítószámát, amelyek letölthetők a MongoDB adattárból.

Nézzünk meg egy mintadokumentumot, miután importáltuk egy úgynevezett gyűjteménybe cipzárak ban,-ben teszt adatbázis.

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

Az egyszerűség kedvéért és a kód tömörsége érdekében a következő kódrészletekben feltételezzük, hogy az összes statikus módszerei Összesítés osztályokat statikusan importálják.

3.1. Szerezzen meg minden olyan államot, amelynek népessége 10 milliónál nagyobb sorrendben csökkenő népesség szerint

Itt három csővezetékünk lesz:

  1. $ csoport szakasz összefoglalja az összes irányítószám populációját
  2. $ egyezés szakasza a 10 millió feletti népességű államok kiszűrésére
  3. $ sort szakaszban az összes dokumentumot a népesség csökkenő sorrendjében rendezheti

A várható kimenetnek mezője lesz _id mint állapot és mező statePop a teljes állami népességgel. Hozzunk létre egy adatmodellt ehhez, és futtassuk az összesítést:

public class StatePoulation {@Id private String állam; magán Integer statePop; // szabványos mérőeszközök és beállítók}

A @Id annotáció feltérképezi a _id mező a kimenettől a állapot a modellben:

GroupOperation groupByStateAndSumPop = group ("állapot") .sum ("pop"). As ("statePop"); MatchOperation filterStates = egyezés (új kritérium ("statePop"). Gt (10000000)); SortOperation sortByPopDesc ​​= sort (Sort.by (Direction.DESC, "statePop")); Összesítés összesítése = newAggregation (groupByStateAndSumPop, filterStates, sortByPopDesc); AggregationResults result = mongoTemplate.aggregate (aggregáció, "zipek", StatePopulation.class);

A Összesítés eredményei osztályos eszközei Iterálható és ezért iterálni tudunk rajta és kinyomtatni az eredményeket.

Ha a kimeneti adatmodell nem ismert, akkor a szokásos MongoDB osztály Dokumentum használható.

3.2. Szerezd meg a legkisebb államot a város átlagos lakossága szerint

Ehhez a problémához négy szakaszra lesz szükségünk:

  1. $ csoport összesítve az egyes városok teljes lakosságát
  2. $ csoport az egyes államok átlagos népességének kiszámításához
  3. $ sort szakasz az államok átlagos városi népességük szerinti növekvő sorrendben történő rendezésére
  4. $ limit hogy megszerezzük az első olyan államot, ahol a legalacsonyabb az átlagos városi népesség

Bár nem feltétlenül szükséges, használunk egy kiegészítőt $ projekt szakaszban formázza át a dokumentumot Állam népesség adatmodell.

GroupOperation sumTotalCityPop = group ("állam", "város") .sum ("pop"). As ("cityPop"); GroupOperation averageStatePop = group ("_ id.state") .avg ("cityPop"). As ("avgCityPop"); SortOperation sortByAvgPopAsc = sort (Sort.by (Direction.ASC, "avgCityPop")); LimitOperation limitToOnlyFirstDoc = határérték (1); ProjectionOperation projectToMatchModel = project () .andExpression ("_ id"). As ("state") .andExpression ("avgCityPop"). As ("statePop"); Összesítés összesítése = newAggregation (sumTotalCityPop, averageStatePop, sortByAvgPopAsc, limitToOnlyFirstDoc, projectToMatchModel); AggregationResults result = mongoTemplate .aggregate (aggregáció, "zipek", StatePopulation.class); StatePopulation legkisebbState = result.getUniqueMappedResult ();

Ebben a példában már tudjuk, hogy csak egy dokumentum lesz az eredményben, mivel az utolsó szakaszban 1-re korlátozzuk a kimeneti dokumentumok számát. Mint ilyen, hivatkozhatunk getUniqueMappedResult () hogy megkapja a szükséges Állam népesség példa.

Egy másik dolog, amit észre kell venni, hogy ahelyett, hogy a @Id annotáció a térképhez _id kijelentésére kifejezetten a vetítés szakaszában tettük.

3.3. Szerezze be az államot a maximális és a minimális irányítószámokkal

Ehhez a példához három szakaszra van szükségünk:

  1. $ csoport hogy megszámláljuk az egyes államok irányítószámainak számát
  2. $ sort hogy az államokat az irányítószámok száma szerint rendezze
  3. $ csoport hogy megtalálja az állapotot max és min irányítószámokkal a Először $ és $ last üzemeltetők
GroupOperation sumZips = group ("állapot"). Count (). As ("zipCount"); SortOperation sortByCount = sort (Direction.ASC, "zipCount"); GroupOperation groupFirstAndLast = group (). First ("_ id"). As ("minZipState"). First ("zipCount"). As ("minZipCount"). Last ("_ id") as ("maxZipState") .last ("zipCount"). as ("maxZipCount"); Összesítés összesítése = newAggregation (sumZips, sortByCount, groupFirstAndLast); AggregationResults result = mongoTemplate .aggregate (összesítés, "zipek", Document.class); Dokumentumdokumentum = result.getUniqueMappedResult ();

Itt nem használtunk egyetlen modellt sem, de a Dokumentum már biztosított a MongoDB illesztőprogrammal.

4. Következtetés

Ebben a cikkben megtanultuk, hogyan lehet lekérni egy dokumentum meghatározott mezőit a MongoDB-ben a Spring Data MongoDB vetületeinek felhasználásával.

A Spring Data-ban megtudtuk a MongoDB összesítési keretrendszer támogatását is. Kitértünk a főbb összesítési fázisokra - csoport, projekt, rendezés, korlátozás és egyeztetés, és néhány példát megvizsgáltunk gyakorlati alkalmazásaira. A teljes forráskód elérhető a GitHub oldalon.


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