Spring Data MongoDB - indeksi, napomene i pretvarači

1. Pregled

Ovaj će vodič istražiti neke od osnovnih značajki Spring Data MongoDB - indeksiranje, uobičajene bilješke i pretvarači.

2. Kazala

2.1. @Indeksirano

Ova napomena označava polje kao indeksirano u MongoDB:

@QueryEntity @Document korisnik javne klase {@Indexed private String name; ...}

Sad kad je Ime polje je indeksirano - pogledajmo indekse u MongoDB:

db.user.getIndexes ();

Evo što imamo na razini baze podataka:

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

Kao što vidite, imamo dva indeksa - jedan od njih je _iskaznica - koji je stvoren prema zadanim postavkama zbog @Iskaznica anotacija i druga je naša Ime polje.

2.2. Programsko izradite indeks

Indeks možemo napraviti i programski:

mongoOps.indexOps (User.class). sureIndex (novi Index (). on ("ime", Direction.ASC)); 

Sada smo stvorili indeks za polje Ime a rezultat će biti isti kao u prethodnom odjeljku.

2.3. Složeni indeksi

MongoDB podržava složene indekse, gdje jedna struktura indeksa sadrži reference na više polja.

Pogledajmo brzi primjer korištenja složenih indeksa:

@QueryEntity @Document @CompoundIndexes ({@CompoundIndex (name = "email_age", def = "{'email.id': 1, 'age': 1}")}) Korisnik javne klase {//}

Stvorili smo složeni indeks s e-mail i dob polja. Pogledajmo sada stvarne indekse:

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

Imajte na umu da a DBRef polje se ne može označiti s @Indeks - to polje može biti samo dio složenog indeksa.

3. Uobičajene bilješke

3.1 @Prijelazno

Kao što biste očekivali, ova jednostavna bilješka isključuje polje iz postojanja u bazi podataka:

korisnik javne klase {@Transient private Integer yearOfBirth;
 // standardni geter i postavljač}

Umetnimo korisnika s poljem za podešavanje godina rođenja:

Korisnik korisnik = novi korisnik (); user.setName ("Alex"); user.setYearOfBirth (1985); mongoTemplate.insert (korisnik); 

Sada, ako pogledamo stanje baze podataka, vidimo da je prijavljena godina rođenja nije spremljeno:

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

Pa ako upitamo i provjerimo:

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

Rezultat će biti null.

3.2. @Polje

@Polje označava ključ koji će se koristiti za polje u JSON dokumentu:

@Field ("email") privatna adresa e-pošte adresa e-pošte; 

Sada email adresa bit će spremljeni u bazu podataka pomoću ključa e-mail:

Korisnik korisnik = novi korisnik (); user.setName ("Brendan"); EmailAddress emailAddress = nova adresa e-pošte (); emailAddress.setValue ("[e-pošta zaštićena]"); user.setEmailAddress (emailAddress); mongoTemplate.insert (korisnik); 

I stanje baze podataka:

{"_id": ObjectId ("55d076d80bad441ed114419d"), "name": "Brendan", "age": null, "email": {"value": "[email protected]"}}

3.3. @PersistenceConstructor i @Vrijednost

@PersistenceConstructor označava konstruktor, čak i onaj koji je zaštićen paketom, kao primarni konstruktor koji koristi logika postojanja. Argumenti konstruktora mapiraju se po imenu na ključne vrijednosti u dohvaćenom DBObject.

Pogledajmo ovaj konstruktor za naš Korisnik razred:

Javni korisnik @PersistenceConstructor (Ime niza, @Vrijednost ("# root.age?: 0") Cijela dob, Adresa e-pošte adresa e-pošte) {this.name = name; this.age = dob; this.emailAddress = adresa e-pošte; } 

Primijetite upotrebu standardne opruge @Vrijednost bilješka ovdje. Pomoću ove bilješke možemo koristiti Spring Expressions za transformiranje vrijednosti ključa dohvaćene iz baze podataka prije nego što se koristi za konstrukciju objekta domene. To je ovdje vrlo moćna i vrlo korisna značajka.

U našem primjeru ako dob nije postavljeno da će biti postavljeno na 0 prema zadanim postavkama.

Pogledajmo sada kako to funkcionira:

Korisnik korisnik = novi korisnik (); user.setName ("Alex"); mongoTemplate.insert (korisnik);

Naša baza podataka izgledat će:

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

Dakle dob polje je null, ali kada ispitamo dokument i dohvatimo ga dob:

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

Rezultat će biti 0.

4. Pretvarači

Pogledajmo sada još jednu vrlo korisnu značajku Spring Data MongoDB - pretvarača, a posebno na MongoConverter.

To se koristi za rukovanje mapiranjem svih tipova Java na DBObjects prilikom spremanja i ispitivanja tih objekata.

Imamo dvije mogućnosti - s kojima možemo surađivati MappingMongoConverter - ili SimpleMongoConverter u ranijim verzijama (ovo je zastarjelo u Spring Data MongoDB M3 i njegova je funkcionalnost premještena u MappingMongoConverter).

Ili možemo napisati vlastiti prilagođeni pretvarač. Da bismo to učinili, trebali bismo implementirati Konverter sučelje i registrirati provedbu u sustavu Windows MongoConfig.

Pogledajmo brzi primjer. Kao što ste vidjeli u nekim JSON izlazima ovdje, svi objekti spremljeni u bazi podataka imaju polje _razred koja se automatski sprema. Ako bismo, međutim, željeli preskočiti to određeno polje tijekom trajanja, to možemo učiniti pomoću a MappingMongoConverter.

Prvo - evo implementacije prilagođenog pretvarača:

@Component javna klasa UserWriterConverter implementira Converter {@Override public DBObject convert (User user) {DBObject dbObject = new BasicDBObject (); dbObject.put ("ime", user.getName ()); dbObject.put ("dob", user.getAge ()); if (user.getEmailAddress ()! = null) {DBObject emailDbObject = new BasicDBObject (); emailDbObject.put ("vrijednost", user.getEmailAddress (). getValue ()); dbObject.put ("e-pošta", emailDbObject); } dbObject.removeField ("_ klasa"); vratiti dbObject; }}

Primijetite kako lako možemo postići cilj da ne ustrajemo _razred uklanjanjem polja izravno ovdje.

Sada moramo registrirati prilagođeni pretvarač:

privatni Popis pretvarači = novi ArrayList(); @Override public MongoCustomConversions customConversions () {converters.add (new UserWriterConverter ()); vratiti nove MongoCustomConversions (pretvarače); }

Isti rezultat naravno možemo postići i s XML konfiguracijom ako trebamo:

Sada, kad spremimo novog korisnika:

Korisnik korisnik = novi korisnik (); user.setName ("Chris"); mongoOps.insert (korisnik); 

Dobiveni dokument u bazi podataka više ne sadrži podatke o klasi:

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

5. Zaključak

U ovom smo tutorijalu pokrili neke temeljne koncepte rada s Spring Data MongoDB - indeksiranje, uobičajene bilješke i pretvarači.

Implementacija svih ovih primjera i isječaka koda može se naći u moj github projekt.


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