Introduksjon til Spring Data MongoDB

1. Oversikt

Denne artikkelen vil være en rask og praktisk introduksjon til Spring Data MongoDB.

Vi vil gå gjennom det grunnleggende ved å bruke begge MongoTemplate i tillegg til MongoRepository ved hjelp av praktiske eksempler for å illustrere hver operasjon.

2. MongoTemplateog MongoRepository

De MongoTemplatefølger standardmalmønsteret om våren og gir en klar, grunnleggende API til den underliggende persistensmotoren.

Datalageret følger vårens datasentriske tilnærming og kommer med mer fleksible og komplekse API-operasjoner, basert på de kjente tilgangsmønstrene i alle Spring Data-prosjekter.

For begge deler må vi begynne med å definere avhengighet - for eksempel i pom.xml, med Maven:

 org.springframework.data spring-data-mongodb 3.0.3.RELEASE 

For å sjekke om noen ny versjon av biblioteket er utgitt - spor utgivelsene her.

3. Konfigurasjon for MongoTemplate

3.1. XML-konfigurasjon

La oss starte med den enkle XML-konfigurasjonen for Mongo-malen:

Først må vi definere fabrikkbønnen som er ansvarlig for å lage Mongo-forekomster.

Neste - vi må faktisk definere (og konfigurere) malbønnen:

Og til slutt må vi definere en etterbehandler for å oversette hvilken som helst MongoExceptions kastet inn @Oppbevaringssted merkede klasser:

3.2. Java-konfigurasjon

La oss nå opprette en lignende konfigurasjon ved hjelp av Java config ved å utvide basisklassen for MongoDB-konfigurasjon AbstractMongoConfiguration:

@Configuration offentlig klasse MongoConfig utvider AbstractMongoClientConfiguration {@ Override-beskyttet streng getDatabaseName () {return "test"; } @ Override public MongoClient mongoClient () {ConnectionString connectionString = new ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); returner MongoClients.create (mongoClientSettings); } @Override offentlig samling getMappingBasePackages () {return Collections.singleton ("com.baeldung"); }}

Merk: Vi trengte ikke definere MongoTemplate bønne i forrige konfigurasjon slik den allerede er definert i AbstractMongoClientConfiguration.

Vi kan også bruke konfigurasjonen vår fra bunnen av uten å utvide den AbstractMongoClientConfiguration - som følger:

@Configuration public class SimpleMongoConfig {@Bean public MongoClient mongo () {ConnectionString connectionString = new ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); returner MongoClients.create (mongoClientSettings); } @Bean offentlig MongoTemplate mongoTemplate () kaster Unntak {returner nytt MongoTemplate (mongo (), "test"); }}

4. Konfigurasjon for MongoRepository

4.1. XML-konfigurasjon

For å gjøre bruk av egendefinerte depoter (utvide MongoRepository) - vi må fortsette konfigurasjonen fra avsnitt 3.1 og sette opp repositoriene:

4.2. Java-konfigurasjon

På samme måte vil vi bygge videre på konfigurasjonen vi allerede opprettet i avsnitt 3.2 og legge til en ny kommentar i blandingen:

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

4.3. Opprett depotet

Nå, etter konfigurasjonen, må vi opprette et lager - utvide det eksisterende MongoRepository grensesnitt:

offentlig grensesnitt UserRepository utvider MongoRepository {//}

Nå kan vi koble dette automatisk UserRepository og bruke operasjoner fra MongoRepository eller legg til tilpassede operasjoner.

5. Bruke MongoTemplate

5.1. Sett inn

La oss starte med innsatsoperasjonen; la oss også starte med en tom database:

{ }

Nå hvis vi setter inn en ny bruker:

Brukerbruker = ny bruker (); user.setName ("Jon"); mongoTemplate.insert (bruker, "bruker");

Databasen vil se slik ut:

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

5.2. Lagre - Sett inn

De lagre operasjonen har lagre eller oppdater semantikk: hvis en id er tilstede, utfører den en oppdatering, hvis ikke - den gjør et innlegg.

La oss se på den første semantikken - innsatsen; her er den opprinnelige tilstanden til databasen:

{ }

Når vi nå lagre en ny bruker:

Brukerbruker = ny bruker (); user.setName ("Albert"); mongoTemplate.save (bruker, "bruker");

Enheten vil bli satt inn i databasen:

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

Deretter ser vi på den samme operasjonen - lagre - med oppdateringssemantikk.

5.3. Lagre - Oppdater

La oss nå se på lagre med oppdateringssemantikk, som opererer på en eksisterende enhet:

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

Nå når vi lagre den eksisterende brukeren - vi vil oppdatere den:

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

Databasen vil se slik ut:

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

Som du kan se, i dette spesifikke eksemplet, lagre bruker semantikken til Oppdater, fordi vi bruker et objekt med gitt _id.

5.4. UpdateFirst

updateFirst oppdaterer det aller første dokumentet som samsvarer med spørringen.

La oss starte med den opprinnelige tilstanden til databasen:

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

Når vi nå kjører updateFirst:

Query query = new Query (); query.addCriteria (Criteria.where ("navn"). er ("Alex")); Oppdater oppdatering = ny oppdatering (); update.set ("navn", "James"); mongoTemplate.updateFirst (spørring, oppdatering, User.class);

Bare den første oppføringen blir oppdatert:

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

5.5. UpdateMulti

UpdateMultioppdaterer alt dokument som samsvarer med den gitte spørringen.

Først - her er tilstanden til databasen før du gjør updateMulti:

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

La oss nå kjøre updateMulti operasjon:

Query query = new Query (); query.addCriteria (Criteria.where ("navn"). er ("Eugen")); Oppdater oppdatering = ny oppdatering (); update.set ("navn", "Victor"); mongoTemplate.updateMulti (spørring, oppdatering, User.class);

Begge eksisterende objektene vil bli oppdatert i databasen:

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

5.6. FindAndModify

Denne operasjonen fungerer som updateMulti, men det returnerer objektet før det ble endret.

Først - tilstanden til databasen før du ringer findAndModify:

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

La oss se på den faktiske operasjonskoden:

Query query = new Query (); query.addCriteria (Criteria.where ("navn"). er ("Markus")); Oppdater oppdatering = ny oppdatering (); update.set ("navn", "Nick"); Brukerbruker = mongoTemplate.findAndModify (spørring, oppdatering, User.class);

De returnerte brukerobjekt har de samme verdiene som den opprinnelige tilstanden i databasen.

Imidlertid er den nye tilstanden i databasen:

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

5.7. Oppover

De oppover arbeider på finne og endre annet lage semantikk: Hvis dokumentet samsvarer, oppdater det, ellers oppretter du et nytt dokument ved å kombinere spørringen og oppdateringsobjektet.

La oss starte med den opprinnelige tilstanden til databasen:

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

Nå - la oss kjøre oppover:

Query query = new Query (); query.addCriteria (Criteria.where ("navn"). er ("Markus")); Oppdater oppdatering = ny oppdatering (); update.set ("navn", "Nick"); mongoTemplate.upsert (spørring, oppdatering, User.class);

Her er tilstanden til databasen etter operasjonen:

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

5.8. Fjerne

Tilstanden til databasen før du ringer fjerne:

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

La oss nå løpe fjerne:

mongoTemplate.remove (bruker, "bruker");

Resultatet blir som forventet:

{ }

6. Bruke MongoRepository

6.1. Sett inn

Først - tilstanden til databasen før du kjører sett inn:

{ }

Nå, når vi setter inn en ny bruker:

Brukerbruker = ny bruker (); user.setName ("Jon"); userRepository.insert (bruker); 

Her er slutttilstanden til databasen:

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

Legg merke til hvordan operasjonen fungerer på samme måte som sett inn i MongoTemplate API.

6.2. Lagre Sett inn

På samme måte - lagre fungerer det samme som lagre drift i MongoTemplate API.

La oss starte med å se på sett inn semantikk av operasjonen; her er den opprinnelige tilstanden til databasen:

{ }

Nå - vi utfører lagre operasjon:

Brukerbruker = ny bruker (); user.setName ("Aaron"); userRepository.save (bruker);

Dette resulterer i at brukeren blir lagt til i databasen:

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

Legg igjen merke til hvordan, i dette eksemplet, lagre fungerer med sett inn semantikk, fordi vi setter inn et nytt objekt.

6.3. Lagre Oppdater

La oss nå se på den samme operasjonen, men med oppdater semantikk.

Først - her er databasens tilstand før du kjører den nye lagre:

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

Nå - vi utfører operasjonen:

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

Til slutt, her er tilstanden til databasen:

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

Legg igjen merke til hvordan, i dette eksemplet, lagre fungerer med Oppdater semantikk, fordi vi bruker et eksisterende objekt.

6.4. Slett

Tilstanden til databasen før du ringer slett:

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

La oss løpe slett:

userRepository.delete (bruker); 

Resultatet blir ganske enkelt:

{ }

6.5. Finn én

Tilstanden til databasen når Finn én er kalt:

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

La oss nå utføre Finn én:

userRepository.findOne (user.getId ()) 

Resultatet som vil returnere eksisterende data:

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

6.6. Eksisterer

Tilstanden til databasen før du ringer eksisterer:

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

La oss løpe eksisterer:

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

Som selvfølgelig vil komme tilbake ekte.

6.7. Finn alle W. ith Sortere

Tilstanden til databasen før du ringer finn alle:

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

La oss nå løpe finn alle med Sortere:

Liste brukere = userRepository.findAll (Sort.by (Sort.Direction.ASC, "navn"));

Resultatet blir sortert etter navn i stigende rekkefølge:

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

6.8. Finn alle W. ith Sidelig

Tilstanden til databasen før du ringer finn alle:

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

La oss nå utføre finn alle med en paginasjonsforespørsel:

Pageable pageableRequest = PageRequest.of (0, 1); Sideside = userRepository.findAll (pageableRequest); Liste brukere = pages.getContent ();

Resultatet brukere listen vil bare være en bruker:

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

7. Kommentarer

Til slutt, la oss også gå gjennom de enkle merknadene som Spring Data bruker for å drive disse API-operasjonene.

@Id privat streng-id;

Feltnivået @Id merknader kan dekorere alle typer, inkludert lang og streng.

Hvis verdien av @Id feltet ikke er null, det er lagret i databasen som det er; Ellers antar omformeren at du vil lagre en ObjectId i databasen (enten ObjectId, streng eller BigInteger arbeid).

Neste - @Dokument:

@Document Public Class User {//}

Denne kommentaren rett og slett markerer en klasse som et domeneobjekt som må vedvares i databasen, sammen med at vi kan velge navnet på samlingen som skal brukes.

8. Konklusjon

Denne artikkelen var en rask, men omfattende introduksjon til bruk av MongoDB med Spring Data, både via MongoTemplate API samt å bruke MongoRepository.

Implementeringen av alle disse eksemplene og kodebiter kan bli funnet over på Github.


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