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");
    }
}
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 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")
    }
}
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.