Uvod u Spring Data MongoDB

1. Pregled

Ovaj će članak biti brz i praktičan uvod u Spring Data MongoDB.

Ići ćemo preko osnova koristeći oba MongoTemplate kao i MongoRepository koristeći praktične primjere za ilustraciju svake operacije.

2. MongoTemplatei MongoRepository

The MongoTemplateslijedi standardni obrazac predloška u proljeće i pruža osnovni API za pokretanje osnovnog API-ja za upornost.

Spremište slijedi Spring Data-centric pristup i dolazi s fleksibilnijim i složenijim API operacijama, temeljenim na dobro poznatim obrascima pristupa u svim Spring Data projektima.

Za oboje moramo započeti definiranjem ovisnosti - na primjer, u pom.xml, s Mavenom:

 org.springframework.data spring-data-mongodb 3.0.3.OBLAŽENJE 

Da biste provjerili je li izdana neka nova verzija knjižnice, izdanja pratite ovdje.

3. Konfiguracija za MongoTemplate

3.1. XML konfiguracija

Počnimo s jednostavnom XML konfiguracijom za Mongo predložak:

Prvo, moramo definirati tvornički grah odgovoran za stvaranje instanci Mongo.

Dalje - trebamo zapravo definirati (i konfigurirati) zrno predloška:

I na kraju, moramo definirati postprocesor za prevođenje bilo kojeg MongoExceptions ubačen @ Repozitorij komentirani satovi:

3.2. Java konfiguracija

Stvorimo sada sličnu konfiguraciju pomoću Java konfiguracije proširujući osnovnu klasu za MongoDB konfiguraciju AbstractMongoConfiguration:

@Configuration javna klasa MongoConfig proširuje AbstractMongoClientConfiguration {@Override zaštićeni niz getDatabaseName () {return "test"; } @Override public MongoClient mongoClient () {ConnectionString connectionString = new ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); return MongoClients.create (mongoClientSettings); } @Override javna zbirka getMappingBasePackages () {return Collections.singleton ("com.baeldung"); }}

Napomena: Nismo trebali definirati MongoTemplate bean u prethodnoj konfiguraciji, kao što je već definirano u AbstractMongoClientConfiguration.

Također možemo koristiti svoju konfiguraciju ispočetka bez proširenja AbstractMongoClientConfiguration - kako slijedi:

@Configuration javna klasa SimpleMongoConfig {@Bean public MongoClient mongo () {ConnectionString connectionString = new ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); return MongoClients.create (mongoClientSettings); } @Bean public MongoTemplate mongoTemplate () baca iznimku {return new MongoTemplate (mongo (), "test"); }}

4. Konfiguracija za MongoRepository

4.1. XML konfiguracija

Da biste koristili prilagođena spremišta (proširujući MongoRepository) - moramo nastaviti konfiguraciju iz odjeljka 3.1 i postaviti spremišta:

4.2. Java konfiguracija

Slično tome, nadogradit ćemo se na konfiguraciju koju smo već stvorili u odjeljku 3.2 i dodati novu napomenu u mix:

@EnableMongoRepositories (basePackages = "com.baeldung.repository") 

4.3. Stvorite Spremište

Sada, nakon konfiguracije, moramo stvoriti spremište - proširujući postojeće MongoRepository sučelje:

javno sučelje UserRepository proširuje MongoRepository {//}

Sada to možemo automatski povezati UserRepository i koristite operacije iz MongoRepository ili dodajte prilagođene operacije.

5. Korištenje MongoTemplate

5.1. Umetnuti

Počnimo s operacijom umetanja; započnimo i s praznom bazom podataka:

{ }

Sad ako umetnemo novog korisnika:

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

Baza podataka izgledat će ovako:

{"_id": ObjectId ("55b4fda5830b550a8c2ca25a"), "_class": "com.baeldung.model.User", "name": "Jon"}

5.2. Spremi - Umetni

The uštedjeti operacija ima semantiku spremanja ili ažuriranja: ako je prisutan id, izvršava ažuriranje, ako ne - izvršava umetanje.

Pogledajmo prvu semantiku - umetak; evo početnog stanja baze podataka:

{ }

Kad smo sada uštedjeti novi korisnik:

Korisnik korisnik = novi korisnik (); user.setName ("Albert"); mongoTemplate.save (korisnik, "korisnik");

Entitet će biti umetnut u bazu podataka:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Albert"}

Dalje ćemo pogledati istu operaciju - uštedjeti - s ažuriranom semantikom.

5.3. Spremi - Ažuriraj

Pogledajmo sada uštedjeti s semantikom ažuriranja, koja radi na postojećem entitetu:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jack"}

Sad, kad mi uštedjeti postojeći korisnik - ažurirat ćemo ga:

user = mongoTemplate.findOne (Query.query (Criteria.where ("name"). je ("Jack")), User.class); user.setName ("Jim"); mongoTemplate.save (korisnik, "korisnik");

Baza podataka izgledat će ovako:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jim"}

Kao što vidite, u ovom konkretnom primjeru, uštedjeti koristi semantiku ažuriranje, jer koristimo objekt s danim _iskaznica.

5.4. UpdateFirst

updateFirst ažurira prvi dokument koji odgovara upitu.

Počnimo s početnim stanjem baze podataka:

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Alex"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Alex "}]

Kad sada pokrenemo updateFirst:

Upit upita = novi upit (); query.addCriteria (Criteria.where ("ime"). je ("Alex")); Ažuriranje ažuriranja = novo Ažuriranje (); update.set ("ime", "James"); mongoTemplate.updateFirst (upit, ažuriranje, User.class);

Ažurirat će se samo prvi unos:

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "James"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Alex "}]

5.5. UpdateMulti

UpdateMultiažurira sav dokument koji se podudara s danim upitom.

Prvo - evo stanja baze podataka prije nego što napravite updateMulti:

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Eugen"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Eugen "}] 

Ajmo sada pokrenuti updateMulti operacija:

Upit upita = novi upit (); query.addCriteria (Criteria.where ("ime"). je ("Eugen")); Ažuriranje ažuriranja = novo Ažuriranje (); update.set ("ime", "Victor"); mongoTemplate.updateMulti (upit, ažuriranje, User.class);

Oba postojeća objekta ažurirat će se u bazi podataka:

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Victor"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614c"), "_class ":" com.baeldung.model.User "," name ":" Victor "}]

5.6. FindAndModify

Ova operacija djeluje kao updateMulti, ali to vraća objekt prije nego što je izmijenjen.

Prvo - stanje baze podataka prije poziva findAndModify:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Markus"} 

Pogledajmo stvarni operativni kod:

Upit upita = novi upit (); query.addCriteria (Criteria.where ("ime"). je ("Markus")); Ažuriranje ažuriranja = novo Ažuriranje (); update.set ("ime", "Nick"); Korisnik korisnik = mongoTemplate.findAndModify (upit, ažuriranje, User.class);

Povratak objekt korisnika ima iste vrijednosti kao početno stanje u bazi podataka.

Međutim, novo stanje u bazi podataka je:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Nick"}

5.7. Upsert

The upsert radovi operiraju na pronaći i izmijeniti drugo stvoriti semantiku: ako se dokument podudara, ažurirajte ga, inače stvorite novi dokument kombiniranjem upita i objekta ažuriranja.

Počnimo s početnim stanjem baze podataka:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Markus"}

A sada - pokrenimo upsert:

Upit upita = novi upit (); query.addCriteria (Criteria.where ("ime"). je ("Markus")); Ažuriranje ažuriranja = novo Ažuriranje (); update.set ("ime", "Nick"); mongoTemplate.upsert (upit, ažuriranje, User.class);

Evo stanja baze podataka nakon operacije:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Nick"}

5.8. Ukloniti

Stanje baze podataka prije poziva ukloniti:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Benn"}

Ajmo sad trčati ukloniti:

mongoTemplate.remove (korisnik, "korisnik");

Rezultat će biti očekivan:

{ }

6. Korištenje MongoRepository

6.1. Umetnuti

Prvo - stanje baze podataka prije pokretanja umetnuti:

{ }

Sada, kada umetnemo novog korisnika:

Korisnik korisnik = novi korisnik (); user.setName ("Jon"); userRepository.insert (korisnik); 

Evo završnog stanja baze podataka:

{"_id": ObjectId ("55b4fda5830b550a8c2ca25a"), "_class": "com.baeldung.model.User", "name": "Jon"}

Imajte na umu kako operacija radi isto kao i umetnuti u MongoTemplate API.

6.2. Uštedjeti Umetnuti

Slično tome - uštedjeti radi isto kao i uštedjeti operacija u MongoTemplate API.

Krenimo od gledanja semantika umetka operacije; evo početnog stanja baze podataka:

{ }

Sada - izvršavamo uštedjeti operacija:

Korisnik korisnik = novi korisnik (); user.setName ("Aaron"); userRepository.save (korisnik);

To rezultira dodavanjem korisnika u bazu podataka:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Aaron"}

Ponovno zabilježite kako u ovom primjeru uštedjeti radi s umetnuti semantike, jer ubacujemo novi objekt.

6.3. Uštedjeti ažuriranje

Pogledajmo sada istu operaciju, ali s ažurirati semantiku.

Prvo - evo stanja baze podataka prije pokretanja nove uštedjeti:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jack" 81 * 6}

Sada - izvršavamo operaciju:

user = mongoTemplate.findOne (Query.query (Criteria.where ("name"). je ("Jack")), User.class); user.setName ("Jim"); userRepository.save (korisnik);

Na kraju, evo stanja baze podataka:

{"_id": ObjectId ("55b52bb7830b8c9b544b6ad5"), "_class": "com.baeldung.model.User", "name": "Jim"}

Ponovno zabilježite kako u ovom primjeru uštedjeti radi s ažuriranje semantiku, jer koristimo postojeći objekt.

6.4. Izbrisati

Stanje baze podataka prije poziva izbrisati:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Benn"}

Trčimo izbrisati:

userRepository.delete (korisnik); 

Rezultat će jednostavno biti:

{ }

6.5. FindOne

Stanje baze podataka kada findOne Zove se:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Chris"}

Izvršimo sada findOne:

userRepository.findOne (user.getId ()) 

Rezultat koji će vratiti postojeće podatke:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Chris"}

6.6. Postoji

Stanje baze podataka prije poziva postoji:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Harris"}

A sad, bježimo postoji:

boolean isExists = userRepository.exists (user.getId ());

Što će se naravno vratiti pravi.

6.7. Pronađi sve W i Vrsta

Stanje baze podataka prije poziva pronađi sve:

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}, {"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Adam "}]

Ajmo sad trčati pronađi sve s Vrsta:

Popis korisnika = userRepository.findAll (Sort.by (Sort.Direction.ASC, "ime"));

Rezultat će biti poredano po imenu u rastućem redoslijedu:

[{"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Adam"}, {"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Brendan "}]

6.8. Pronađi sve W i Pageable

Stanje baze podataka prije poziva pronađi sve:

[{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}, {"_id": ObjectId ("67b5ffa5511fee0e45ed614b"), "_class ":" com.baeldung.model.User "," name ":" Adam "}]

Ajmo sada izvršiti pronađi sve sa zahtjevom za paginaciju:

Pageable pageableRequest = PageRequest.of (0, 1); Stranica stranice = userRepository.findAll (pageableRequest); Popis korisnika = pages.getContent ();

Dobivena korisnika Popis će biti samo jedan korisnik:

{"_id": ObjectId ("55b5ffa5511fee0e45ed614b"), "_class": "com.baeldung.model.User", "name": "Brendan"}

7. Bilješke

Na kraju, idemo i na jednostavne napomene koje Spring Data koristi za pogon ovih API operacija.

@Id private String id;

Razina polja @Iskaznica napomena može ukrasiti bilo koju vrstu, uključujući dugo i niz.

Ako je vrijednost @Iskaznica polje nije null, pohranjuje se u bazu podataka takvo kakvo jest; u suprotnom, pretvarač će pretpostaviti da želite pohraniti ObjectId u bazi podataka (bilo ObjectId, String ili BigInteger raditi).

Sljedeći - @Dokument:

Korisnik javne klase @Document {//}

Ova napomena jednostavno označava klasu kao objekt domene to treba zadržati u bazi podataka, zajedno s dopuštanjem odabira naziva zbirke koja će se koristiti.

8. Zaključak

Ovaj je članak bio brz, ali sveobuhvatan uvod u upotrebu MongoDB-a s Spring Data, oba putem MongoTemplate API, kao i korištenje MongoRepository.

Implementacija svih ovih primjera i isječaka koda može se naći preko na Githubu.