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: 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: Rovnaký výsledok môžeme samozrejme dosiahnuť aj pomocou konfigurácie XML, ak potrebujeme: Teraz, keď uložíme nového používateľa: Výsledný dokument v databáze už neobsahuje informácie o triede: 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.@ 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; }}
súkromný zoznam
User user = new User (); user.setName ("Chris"); mongoOps.insert (užívateľ);
{"_id": ObjectId ("55cf09790bad4394db84b853"), "name": "Chris", "age": null}
5. Záver