MongoDB is an open source NoSQL document database that uses a JSON-like schema instead of traditional relational data-based tables. Spring Boot contains several helpers for working with MongoDB, including the spring-boot-starter-data-mongodb and spring-boot-starter-data-mongodb-reactive starters.

Connecting to a MongoDB database

To access MongoDB databases, you can implement an auto-configurable org.springframework.data.mongodb.MongoDatabaseFactory. By default, the instance will try to connect to the MongoDB server at mongodb://localhost/test. The following example shows how to connect to a MongoDB database:

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

If a custom MongoClient has been defined, it will be used to auto-configure the appropriate MongoDatabaseFactory.

An auto-configured MongoClient is created using the MongoClientSettings bean. If a custom MongoClientSettings was defined, it will be used as is, and the spring.data.mongodb properties will be ignored. Otherwise, MongoClientSettings will be automatically configured and the properties of spring.data.mongodb will be applied to it. In any case, you can declare one or more MongoClientSettingsBuilderCustomizer beans to fine-tune the MongoClientSettings configuration. Each of them will be called in order through the MongoClientSettings.Builder, which is used to build the MongoClientSettings.

You can set the spring.data.mongodb.uri property to change the URL and add additional parameters to the configuration, such as replica set, as shown in the following example:

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"

Alternatively, you can specify the connection details with using discrete properties. For example, you can declare the following settings in the application.properties file:

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"
If spring.data.mongodb.port is not specified, the default value 27017 is used. You can remove this line from the example shown earlier.
If you are not using Spring Data MongoDB, you can implement a MongoClient bean instead using MongoDatabaseFactory. If you need complete control over the process of establishing a connection to MongoDB, you can optionally declare your own MongoDatabaseFactory or MongoClient bean.
When using the reactive driver, the SSL protocol requires the Netty framework. Autoconfiguration configures this factory automatically if the Netty framework is available and the factory being used has not yet been configured.

MongoTemplate

Spring Data MongoDB> provides a MongoTemplate class that its structure is very similar to JdbcTemplate from Spring. As with JdbcTemplate, Spring Boot automatically adds a template injection bean to the configuration as follows:

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

Repositories Spring Data MongoDB

Spring Data provides repository support for MongoDB. As with the JPA repositories discussed earlier, the basic principle is that queries are built automatically based on method names.

In fact, both Spring Data JPA and Spring Data MongoDB have the same the same general infrastructure. You can take the JPA example from the previous article and, provided that City is now a MongoDB data class and not a JPA object with the @Entity annotation, it will work exactly like this same as shown in the following example:

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?
}
You can configure document scanning locations using the @EntityScan annotation.

Embedded Mongo system

Spring Boot provides automatic configuration for Embedded Mongo. To use it in your Spring Boot application, add a dependency on de.flapdoodle.embed:de.flapdoodle.embed.mongo and set the spring.mongodb.embedded.version property to according to the version of MongoDB that the application will use in a production environment.

The default boot configuration allows access to most of the versions listed in the version class Embedded Mongo, as well as some others. Configuring an unavailable version will result in an error when attempting to boot the server. This error can be resolved by defining an appropriately configured DownloadConfigBuilderCustomizer bean.

The port that Mongo listens on can be added to the configuration by setting the property spring.data.mongodb.port. To use a randomly assigned free port, use a value of 0. MongoClient created with MongoAutoConfiguration is automatically configured to use a randomly assigned port.

If you do not configure a custom port, the native support will default to a random port (rather than 27017).

If SLF4J is in the classpath, the output data generated by Mongo is automatically routed to a logging manager named org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo.

You can declare your own IMongodConfig beans and IRuntimeConfig to manage Mongo instance configuration and logging routing. The download configuration can be configured by declaring the DownloadConfigBuilderCustomizer bean.