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:

Java
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");
    }
}
Kotlin
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-адрес и добавить в конфигурацию дополнительные параметры, такие как набор реплик, как показано в следующем примере:

Properties
spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test
Yaml
spring:
  data:
    mongodb:
      uri: "mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test"

В качестве альтернативы можно задать детали соединения с помощью дискретных свойств. Например, можно объявить следующие параметры в файле application.properties:

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
Yaml
spring:
  data:
    mongodb:
      host: "mongoserver.example.com"
      port: 27017
      database: "test"
      username: "user"
      password: "secret"
Если spring.data.mongodb.port не задан, используется значение по умолчанию 27017. Можно удалить эту строку из примера, показанного ранее.
Если Spring Data MongoDB не используется, то можно внедрить бин MongoClient вместо использования MongoDatabaseFactory. Если необходимо полностью контролировать процесс установления соединения с MongoDB, можно дополнительно объявить свой собственный бин MongoDatabaseFactory или MongoClient.
При использовании реактивного драйвера для работы протокола SSL требуется фреймворк Netty. Автоконфигурация настраивает эту фабрику автоматически, если фреймворк Netty доступен, а используемая фабрика еще не была настроена.

MongoTemplate

Spring Data MongoDB> предусматривает класс MongoTemplate, который по своей структуре очень похож на JdbcTemplate из Spring. Как и в случае с JdbcTemplate, Spring Boot автоматически добавляет в конфигурацию бин для внедрения шаблона следующим образом:

Java
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");
    }
}
Kotlin
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, он будет работать точно так же, как показано в следующем примере:

Java
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);
}
Kotlin
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, которую приложение будет использовать в производственном окружении.

Конфигурация загрузки по умолчанию позволяет получить доступ к большинству версий, перечисленных в классе версии встраиваемой системы Mongo, а также к некоторым другим. Конфигурирование недоступной версии приведет к возникновению ошибке при попытке загрузки сервера. Такую ошибку можно устранить, определив соответствующим образом сконфигурированный бин DownloadConfigBuilderCustomizer.

Порт, который прослушивается Mongo, можно добавить в конфигурацию, установив свойство spring.data.mongodb.port. Для использования свободного порта, назначенного случайным образом, используйте значение 0. MongoClient, созданный с помощью MongoAutoConfiguration, автоматически конфигурируется на использование порта, назначенного случайным образом.

Если вы не сконфигурируете пользовательский порт, встроенные средства поддержки по умолчанию будут использовать случайный порт (а не 27017).

Если в classpath находится SLF4J, выводимые данные, созданные Mongo, автоматически маршрутизируются в диспетчер журналирования с именем org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo.

Можно объявить собственные бины IMongodConfig и IRuntimeConfig, чтобы управлять конфигурацией экземпляра Mongo и маршрутизацией журналирования. Конфигурацию загрузки можно настроить путем объявления бина DownloadConfigBuilderCustomizer.