Spring Data MongoDB - indexy, anotácie a prevádzače

1. Prehľad

V tomto výučbe sa pozrieme na niektoré základné funkcie Spring Data MongoDB - indexovanie, bežné poznámky a prevádzače.

2. Indexy

2.1. @Indexed

Táto anotácia označí pole ako indexované v MongoDB:

@QueryEntity @Document verejná trieda Používateľ {@Indexed súkromné ​​meno reťazca; ...}

Teraz, keď názov pole je indexované - pozrime sa na indexy v MongoDB:

db.user.getIndexes ();

Na úrovni databázy máme toto:

[{"v": 1, "key": {"_id": 1}, "name": "_id_", "ns": "test.user"}, {"v": 1, "key": {"name": 1}, "name": "name", "ns": "test.user"}]

Ako vidíte, máme dva indexy - jeden z nich je _id - ktorý bol štandardne vytvorený z dôvodu - @Id anotácia a druhý je náš názov lúka.

2.2. Vytvorte index programovo

Index môžeme vytvoriť aj programovo:

mongoOps.indexOps (User.class). zabezpečiťIndex (nový index (). na ("názov", smer.ASC)); 

Teraz sme vytvorili index pre dané pole názov a výsledok bude rovnaký ako v predchádzajúcej časti.

2.3. Zložené indexy

MongoDB podporuje zložené indexy, kde jedna štruktúra indexu obsahuje odkazy na viac polí.

Pozrime sa na krátky príklad použitia zložených indexov:

@QueryEntity @Document @CompoundIndexes ({@CompoundIndex (name = "email_age", def = "{'email.id': 1, 'age': 1}")}) užívateľ verejnej triedy {//}

Vytvorili sme zložený index s e-mail a Vek polia. Poďme sa teraz pozrieť na skutočné indexy:

{"v": 1, "key": {"email.id": 1, "age": 1}, "name": "email_age", "ns": "test.user"} 

Všimnite si, že a DBRef pole nemožno označiť @Index - toto pole môže byť iba súčasťou zloženého indexu.

3. Bežné anotácie

3.1 @ Prechodné

Ako by ste čakali, táto jednoduchá anotácia vylučuje pretrvávanie poľa v databáze:

verejná trieda Používateľ {@Transient private Integer yearOfBirth;
 // štandardný getter a setter}

Vložme používateľa do poľa nastavenia rok narodenia:

User user = new User (); user.setName ("Alex"); user.setYearOfBirth (1985); mongoTemplate.insert (užívateľ); 

Teraz, keď sa pozrieme na stav databázy, uvidíme, že je uložená rok narodenia nebol uložený:

{"_id": ObjectId ("55d8b30f758fd3c9f374499b"), "name": "Alex", "age": null}

Takže ak dopytujeme a kontrolujeme:

mongoTemplate.findOne (Query.query (Criteria.where ("name"). is ("Alex")), User.class) .getYearOfBirth ()

Výsledok bude nulový.

3.2. @Lúka

@Lúka označuje kľúč, ktorý sa má použiť pre pole v dokumente JSON:

@Field („email“) súkromná EmailAddress emailAddress; 

Teraz emailová adresa sa uloží do databázy pomocou kľúča e-mail:

User user = new User (); user.setName ("Brendan"); EmailAddress emailAddress = nová EmailAddress (); emailAddress.setValue ("[chránený e-mailom]"); user.setEmailAddress (emailAddress); mongoTemplate.insert (užívateľ); 

A stav databázy:

{"_id": ObjectId ("55d076d80bad441ed114419d"), "name": "Brendan", "age": null, "email": {"value": "[chránený e-mailom]"}}

3.3. @PersistenceConstructor a @Hodnota

@PersistenceConstructor označí konštruktor, dokonca aj ten, ktorý je chránený balíkom, ako primárny konštruktor používaný logikou vytrvalosti. Argumenty konštruktora sú mapované podľa názvu na hodnoty kľúča v načítanom DBObject.

Pozrime sa na tohto konštruktora pre našu Používateľ trieda:

@PersistenceConstructor public User (názov reťazca, @Value ("# root.age?: 0") celé číslo, e-mailová adresa e-mailová adresa) {this.name = meno; this.age = vek; this.emailAddress = emailAddress; } 

Všimnite si použitie štandardnej pružiny @Hodnota anotácia tu. Pomocou tejto anotácie môžeme pomocou jarných výrazov transformovať hodnotu kľúča získanú z databázy predtým, ako sa použije na vytvorenie doménového objektu. Toto je veľmi silná a veľmi užitočná funkcia.

V našom príklade ak Vek nie je nastavené, že bude nastavené na 0 predvolene.

Pozrime sa teraz, ako to funguje:

User user = new User (); user.setName ("Alex"); mongoTemplate.insert (užívateľ);

Naša databáza bude vyzerať:

{"_id": ObjectId ("55d074ca0bad45f744a71318"), "name": "Alex", "age": null}

Takže Vek pole je nulový, ale keď dopytujeme dokument a načítame ho Vek:

mongoTemplate.findOne (Query.query (Criteria.where ("name"). is ("Alex")), User.class) .getAge ();

Výsledok bude 0.

4. Prevodníky

Poďme sa teraz pozrieť na ďalšiu veľmi užitočnú funkciu v nástroji Spring Data MongoDB - prevádzače, a konkrétne na server MongoConverter.

Toto sa používa na spracovanie mapovania všetkých typov Java na DBObjects pri ukladaní a dopytovaní týchto objektov.

Máme dve možnosti - môžeme buď pracovať MappingMongoConverter - alebo SimpleMongoConverter v starších verziách (toto bolo v Spring Data MongoDB M3 zastarané a jeho funkčnosť bola presunutá do MappingMongoConverter).

Alebo môžeme napísať vlastný prevodník. Aby sme to dosiahli, budeme musieť implementovať Prevádzač rozhranie a zaregistrujte implementáciu v MongoConfig.

Poďme sa pozrieť na rýchly príklad. Ako ste tu videli v niektorých výstupoch JSON, pole majú všetky objekty uložené v databáze _trieda ktorý sa ukladá automaticky. Ak by sme však chceli preskočiť dané pole počas perzistencie, môžeme to urobiť pomocou a MappingMongoConverter.

Prvá - tu je implementácia vlastného prevodníka:

@ Verejná trieda komponentu UserWriterConverter implementuje Converter {@Override public DBObject convert (User user) {DBObject dbObject = new BasicDBObject (); dbObject.put ("meno", user.getName ()); dbObject.put ("vek", user.getAge ()); if (user.getEmailAddress ()! = null) {DBObject emailDbObject = nový BasicDBObject (); emailDbObject.put ("hodnota", user.getEmailAddress (). getValue ()); dbObject.put ("email", emailDbObject); } dbObject.removeField ("_ class"); vrátiť dbObject; }}

Všimnite si, ako môžeme ľahko dosiahnuť cieľ, aby sme nevydržali _trieda konkrétnym odstránením poľa priamo tu.

Teraz musíme zaregistrovať vlastný prevodník:

súkromný zoznam prevádzače = nový ArrayList(); @Override public MongoCustomConversions customConversions () {conversters.add (nový UserWriterConverter ()); vrátiť nové MongoCustomConversions (prevádzače); }

Rovnaký výsledok môžeme samozrejme dosiahnuť aj pomocou konfigurácie XML, ak potrebujeme:

Teraz, keď uložíme nového používateľa:

User user = new User (); user.setName ("Chris"); mongoOps.insert (užívateľ); 

Výsledný dokument v databáze už neobsahuje informácie o triede:

{"_id": ObjectId ("55cf09790bad4394db84b853"), "name": "Chris", "age": null}

5. Záver

V tomto tutoriáli sme sa venovali niektorým základným konceptom práce s Spring Data MongoDB - indexovanie, bežné anotácie a prevádzače.

Implementácia všetkých týchto príkladov a útržkov kódu nájdete v môj projekt github.


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