Inleiding tot Spring Data MongoDB

1. Overzicht

Dit artikel zal snel en praktisch zijn inleiding tot Spring Data MongoDB.

We zullen de basis bespreken met behulp van beide MongoTemplate net zoals MongoRepository met behulp van praktische voorbeelden om elke operatie te illustreren.

2. MongoTemplateen MongoRepository

De MongoTemplatevolgt het standaard sjabloonpatroon in het voorjaar en biedt een kant-en-klare basis-API voor de onderliggende persistentie-engine.

De repository volgt de Spring Data-centric benadering en wordt geleverd met meer flexibele en complexe API-bewerkingen, gebaseerd op de bekende toegangspatronen in alle Spring Data-projecten.

Voor beide moeten we beginnen met het definiëren van de afhankelijkheid, bijvoorbeeld in het pom.xml, met Maven:

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

Als u wilt controleren of er een nieuwe versie van de bibliotheek is uitgebracht, kunt u de releases hier volgen.

3. Configuratie voor MongoTemplate

3.1. XML-configuratie

Laten we beginnen met de eenvoudige XML-configuratie voor de Mongo-sjabloon:

Eerst moeten we de fabrieksboon definiëren die verantwoordelijk is voor het maken van Mongo-instanties.

Vervolgens moeten we de sjabloonboon daadwerkelijk definiëren (en configureren):

En tot slot moeten we een postprocessor definiëren om ze te vertalen Mongo Uitzonderingen gegooid in @Repository geannoteerde klassen:

3.2. Java-configuratie

Laten we nu een vergelijkbare configuratie maken met Java-configuratie door de basisklasse voor MongoDB-configuratie uit te breiden AbstractMongoConfiguration:

@Configuration openbare klasse MongoConfig breidt AbstractMongoClientConfiguration uit {@Override beschermde String getDatabaseName () {retourneer "test"; } @Override openbare MongoClient mongoClient () {ConnectionString connectionString = nieuwe ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); retourneer MongoClients.create (mongoClientSettings); } @Override openbare verzameling getMappingBasePackages () {return Collections.singleton ("com.baeldung"); }}

Opmerking: we hoefden niet te definiëren MongoTemplate bean in de vorige configuratie zoals deze al is gedefinieerd in AbstractMongoClientConfiguration.

We kunnen onze configuratie ook helemaal opnieuw gebruiken zonder uit te breiden AbstractMongoClientConfiguration - als volgt:

@Configuration openbare klasse SimpleMongoConfig {@Bean openbare MongoClient mongo () {ConnectionString connectionString = nieuwe ConnectionString ("mongodb: // localhost: 27017 / test"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder () .applyConnectionString (connectionString) .build (); retourneer MongoClients.create (mongoClientSettings); } @Bean openbare MongoTemplate mongoTemplate () gooit uitzondering {retourneer nieuwe MongoTemplate (mongo (), "test"); }}

4. Configuratie voor MongoRepository

4.1. XML-configuratie

Om gebruik te maken van aangepaste repositories (uitbreiding van het MongoRepository) - we moeten doorgaan met de configuratie van sectie 3.1 en de repositories instellen:

4.2. Java-configuratie

Evenzo zullen we voortbouwen op de configuratie die we al in sectie 3.2 hebben gemaakt en een nieuwe annotatie aan de mix toevoegen:

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

4.3. Maak de repository

Nu, na de configuratie, moeten we een repository maken - het bestaande uitbreiden MongoRepository koppel:

openbare interface UserRepository breidt MongoRepository uit {//}

Nu kunnen we dit automatisch bedraden UserRepository en gebruik bewerkingen van MongoRepository of voeg aangepaste bewerkingen toe.

5. Met behulp van MongoTemplate

5.1. Invoegen

Laten we beginnen met de invoegbewerking; laten we ook beginnen met een lege database:

{ }

Als we nu een nieuwe gebruiker invoegen:

Gebruiker gebruiker = nieuwe gebruiker (); user.setName ("Jon"); mongoTemplate.insert (gebruiker, "gebruiker");

De database ziet er als volgt uit:

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

5.2. Opslaan - invoegen

De sparen operatie heeft save-or-update semantiek: als een id aanwezig is, voert het een update uit, zo niet - dan wordt er ingevoegd.

Laten we eens kijken naar de eerste semantiek - de insert; hier is de begintoestand van de database:

{ }

Als we nu sparen een nieuwe gebruiker:

Gebruiker gebruiker = nieuwe gebruiker (); user.setName ("Albert"); mongoTemplate.save (gebruiker, "gebruiker");

De entiteit wordt in de database ingevoegd:

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

Vervolgens kijken we naar dezelfde bewerking - sparen - met update semantiek.

5.3. Opslaan - bijwerken

Laten we nu eens kijken sparen met update semantiek, opererend op een bestaande entiteit:

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

Nu, wanneer we sparen de bestaande gebruiker - we zullen het updaten:

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

De database ziet er als volgt uit:

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

Zoals u kunt zien, in dit specifieke voorbeeld, sparen gebruikt de semantiek van bijwerken, omdat we een object gebruiken met gegeven _ID kaart.

5.4. Update First

updateFirst werkt het allereerste document bij dat overeenkomt met de zoekopdracht.

Laten we beginnen met de begintoestand van de database:

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

Wanneer we nu het updateFirst:

Queryquery = nieuwe Query (); query.addCriteria (Criteria.where ("naam"). is ("Alex")); Update update = nieuwe update (); update.set ("naam", "James"); mongoTemplate.updateFirst (query, update, User.class);

Alleen het eerste item wordt bijgewerkt:

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

5.5. UpdateMulti

UpdateMultiwerkt alle documenten bij die overeenkomen met de opgegeven zoekopdracht.

Ten eerste - hier is de status van de database voordat u het updateMulti:

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

Laten we nu het updateMulti operatie:

Queryquery = nieuwe Query (); query.addCriteria (Criteria.where ("naam"). is ("Eugen")); Update update = nieuwe update (); update.set ("naam", "Victor"); mongoTemplate.updateMulti (query, update, User.class);

Beide bestaande objecten worden bijgewerkt in de database:

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

5.6. FindAndModify

Deze operatie werkt als updateMulti, maar het geeft het object terug voordat het werd gewijzigd.

Ten eerste - de status van de database voordat u belt findAndModify:

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

Laten we eens kijken naar de feitelijke bewerkingscode:

Queryquery = nieuwe Query (); query.addCriteria (Criteria.where ("naam"). is ("Markus")); Update update = nieuwe update (); update.set ("naam", "Nick"); Gebruiker user = mongoTemplate.findAndModify (query, update, User.class);

De teruggekeerden gebruikersobject heeft dezelfde waarden als de begintoestand in de database.

De nieuwe status in de database is echter:

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

5.7. Upsert

De upsert werken werken op de zoeken en wijzigen anders maken semantiek: als het document overeenkomt, werk het dan bij, maak anders een nieuw document door de query en het update-object te combineren.

Laten we beginnen met de begintoestand van de database:

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

Nu - laten we de upsert:

Queryquery = nieuwe Query (); query.addCriteria (Criteria.where ("naam"). is ("Markus")); Update update = nieuwe update (); update.set ("naam", "Nick"); mongoTemplate.upsert (query, update, User.class);

Hier is de toestand van de database na de operatie:

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

5.8. Verwijderen

De status van de database voordat u belt verwijderen:

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

Laten we nu rennen verwijderen:

mongoTemplate.remove (gebruiker, "gebruiker");

Het resultaat is zoals verwacht:

{ }

6. Met behulp van MongoRepository

6.1. Invoegen

Ten eerste - de status van de database voordat het invoegen:

{ }

Nu, wanneer we een nieuwe gebruiker invoegen:

Gebruiker gebruiker = nieuwe gebruiker (); user.setName ("Jon"); userRepository.insert (gebruiker); 

Dit is de eindtoestand van de database:

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

Merk op hoe de bewerking hetzelfde werkt als de invoegen in de MongoTemplate API.

6.2. Sparen Invoegen

Evenzo - sparen werkt hetzelfde als de sparen operatie in de MongoTemplate API.

Laten we beginnen met te kijken naar de semantiek van het invoegen van de operatie; hier is de begintoestand van de database:

{ }

Nu voeren we het sparen operatie:

Gebruiker gebruiker = nieuwe gebruiker (); user.setName ("Aaron"); userRepository.save (gebruiker);

Dit heeft tot gevolg dat de gebruiker wordt toegevoegd aan de database:

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

Merk nogmaals op hoe, in dit voorbeeld, sparen werkt met invoegen semantiek, omdat we een nieuw object invoegen.

6.3. Sparen Bijwerken

Laten we nu naar dezelfde operatie kijken, maar dan met semantiek bijwerken.

Ten eerste - hier is de status van de database voordat het nieuwe sparen:

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

Nu - we voeren de bewerking uit:

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

Ten slotte is hier de toestand van de database:

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

Merk nogmaals op hoe, in dit voorbeeld, sparen werkt met bijwerken semantiek, omdat we een bestaand object gebruiken.

6.4. Verwijderen

De status van de database voordat u belt verwijderen:

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

Laten we rennen verwijderen:

userRepository.delete (gebruiker); 

Het resultaat is simpelweg:

{ }

6.5. Vind een

De staat van de database wanneer vind een wordt genoemd:

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

Laten we nu het vind een:

userRepository.findOne (user.getId ()) 

Het resultaat dat de bestaande gegevens retourneert:

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

6.6. Bestaat

De status van de database voordat u belt bestaat:

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

Laten we nu rennen bestaat:

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

Die komen natuurlijk terug waar.

6.7. FindAll W ith Soort

De status van de database voordat u belt vind alle:

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

Laten we nu rennen vind alle met Soort:

Lijst gebruikers = userRepository.findAll (Sort.by (Sort.Direction.ASC, "naam"));

Het resultaat zal zijn gesorteerd op naam in oplopende volgorde:

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

6.8. FindAll W ith Pageable

De status van de database voordat u belt vind alle:

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

Laten we nu beginnen vind alle met een pagineringsverzoek:

Pageable pageableRequest = PageRequest.of (0, 1); Paginapagina = userRepository.findAll (pageableRequest); Lijst gebruikers = pages.getContent ();

Het resultaat gebruikers lijst zal slechts één gebruiker zijn:

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

7. Annotaties

Laten we tot slot ook de eenvoudige annotaties bespreken die Spring Data gebruikt om deze API-bewerkingen aan te sturen.

@Id privé String-id;

Het veldniveau @ID kaart annotatie kan elk type versieren, inclusief lang en draad.

Als de waarde van de @ID kaart veld is niet null, het wordt in de huidige database opgeslagen; anders gaat de converter ervan uit dat u een ObjectId in de database (ofwel ObjectId, String of BigInteger werk).

De volgende - @Document:

@Document openbare klasgebruiker {//}

Deze annotatie is eenvoudig markeert een klasse als een domeinobject dat moet worden bewaard in de database, samen met ons in staat te stellen de naam van de te gebruiken collectie te kiezen.

8. Conclusie

Dit artikel was een snelle maar uitgebreide inleiding tot het gebruik van MongoDB met Spring Data, beide via de MongoTemplate API en het gebruik van MongoRepository.

De implementatie van al deze voorbeelden en codefragmenten kan gevonden worden over op Github.