MongoDB – это документная база данных NoSQL с открытым исходным кодом, которая использует JSON-подобную схему вместо традиционных реляционных данных, основанных на таблицах. Spring Boot содержит несколько вспомогательных средств для работы с MongoDB, включая "стартеры" spring-boot-starter-data-mongodb и spring-boot-starter-data-mongodb-reactive.
Подключение к базе данных MongoDB
Для доступа к базам данных MongoDB можно внедрить автоконфигурируемую org.springframework.data.mongodb.MongoDatabaseFactory. По умолчанию экземпляр будет пытаться подключиться к серверу MongoDB по адресу mongodb://localhost/test. В следующем примере показано, как происходит подключение к базе данных MongoDB:
import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.stereotype.Component; @Component public class MyBean { private final MongoDatabaseFactory mongo; public MyBean(MongoDatabaseFactory mongo) { this.mongo = mongo; } // ... public MongoCollection<Document> someMethod() { MongoDatabase db = this.mongo.getMongoDatabase(); return db.getCollection("users"); } }
import com.mongodb.client.MongoCollection import org.bson.Document import org.springframework.data.mongodb.MongoDatabaseFactory import org.springframework.stereotype.Component @Component class MyBean(private val mongo: MongoDatabaseFactory) { // ... fun someMethod(): MongoCollection<Document> { val db = mongo.mongoDatabase return db.getCollection("users") } }
Если был определен собственный MongoClient, он будет использоваться для автоконфигурирования подходящей MongoDatabaseFactory.
Автоконфигурируемый MongoClient создается с помощью бина MongoClientSettings. Если был определен собственный MongoClientSettings, он будет использоваться без изменений, а свойства spring.data.mongodb будут проигнорированы. В противном случае MongoClientSettings будет автоматически сконфигурирован и к нему будут применены свойства spring.data.mongodb. В любом случае, можно объявить один или несколько бинов MongoClientSettingsBuilderCustomizer для более тонкой настройки конфигурации MongoClientSettings. Каждый из них будет вызываться по порядку через MongoClientSettings.Builder, который используется для построения MongoClientSettings.
Можно установить свойство spring.data.mongodb.uri, чтобы изменить URL-адрес и добавить в конфигурацию дополнительные параметры, такие как набор реплик, как показано в следующем примере:
spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test
spring:
data:
mongodb:
uri: "mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test"
В качестве альтернативы можно задать детали соединения с помощью дискретных свойств. Например, можно объявить следующие параметры в файле application.properties:
spring.data.mongodb.host=mongoserver.example.com
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
spring.data.mongodb.username=user
spring.data.mongodb.password=secret
spring:
data:
mongodb:
host: "mongoserver.example.com"
port: 27017
database: "test"
username: "user"
password: "secret"
spring.data.mongodb.port не задан, используется значение по умолчанию
27017. Можно удалить эту строку из примера, показанного ранее.
MongoClient вместо использования
MongoDatabaseFactory. Если необходимо полностью контролировать процесс установления соединения с MongoDB, можно дополнительно объявить свой собственный бин
MongoDatabaseFactory или
MongoClient.
MongoTemplate
Spring Data MongoDB> предусматривает класс MongoTemplate, который по своей структуре очень похож на JdbcTemplate из Spring. Как и в случае с JdbcTemplate, Spring Boot автоматически добавляет в конфигурацию бин для внедрения шаблона следующим образом:
import com.mongodb.client.MongoCollection; import org.bson.Document; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final MongoTemplate mongoTemplate; public MyBean(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } // ... public MongoCollection<Document> someMethod() { return this.mongoTemplate.getCollection("users"); } }
import com.mongodb.client.MongoCollection import org.bson.Document import org.springframework.data.mongodb.core.MongoTemplate import org.springframework.stereotype.Component @Component class MyBean(private val mongoTemplate: MongoTemplate) { // ... fun someMethod(): MongoCollection<Document> { return mongoTemplate.getCollection("users") } }
Репозитории Spring Data MongoDB
Spring Data содержит средства поддержки репозиториев для MongoDB. Как и в случае с репозиториями для JPA, рассмотренными ранее, основной принцип заключается в том, что запросы строятся автоматически, на основе имен методов.
Фактически, и Spring Data JPA, и Spring Data MongoDB имеют одну и ту же общую инфраструктуру. Можно взять пример для JPA из предыдущей статьи и, при условии, что City теперь является классом данных MongoDB, а не JPA-объектом с аннотацией @Entity, он будет работать точно так же, как показано в следующем примере:
import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.Repository; public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndStateAllIgnoringCase(String name, String state); }
import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable import org.springframework.data.repository.Repository interface CityRepository : Repository<City?, Long?> { fun findAll(pageable: Pageable?): Page<City?>? fun findByNameAndStateAllIgnoringCase(name: String?, state: String?): City? }
@EntityScan.
Встраиваемая система Mongo
Spring Boot предусматривает автоматическую конфигурацию для встраиваемой системы Mongo. Чтобы использовать его в своем приложении Spring Boot, добавьте зависимость от de.flapdoodle.embed:de.flapdoodle.embed.mongo и установите свойство spring.mongodb.embedded.version в соответствии с версией MongoDB, которую приложение будет использовать в производственном окружении.
DownloadConfigBuilderCustomizer.
Порт, который прослушивается Mongo, можно добавить в конфигурацию, установив свойство spring.data.mongodb.port. Для использования свободного порта, назначенного случайным образом, используйте значение 0. MongoClient, созданный с помощью MongoAutoConfiguration, автоматически конфигурируется на использование порта, назначенного случайным образом.
Если в classpath находится SLF4J, выводимые данные, созданные Mongo, автоматически маршрутизируются в диспетчер журналирования с именем org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo.
Можно объявить собственные бины IMongodConfig и IRuntimeConfig, чтобы управлять конфигурацией экземпляра Mongo и маршрутизацией журналирования. Конфигурацию загрузки можно настроить путем объявления бина DownloadConfigBuilderCustomizer.