Post

Spring MongoDB Repository

Spring MongoDB Repository

This post was migrated from Tistory. You can find the original here.

Connecting to MongoDB

1
2
3
4
5
6
7
8
// application.properties

spring.data.mongodb.host= ~~
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
spring.data.mongodb.username=root
spring.data.mongodb.password=1234
spring.data.mongodb.authentication-database=admin

Without the authentication-database setting, I ran into an authentication-related exception.

Defining a Collection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Document(collection = "testCollection")
@Getter
@Setter
@ToString
public class MongoTestEntity {
    @Id
    private String id;

    private String firstName;
    private String lastName;

    public MongoTestEntity(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

Spring MongoDB Repository

1
2
3
public interface MongoTestRepository extends MongoRepository<MongoTestEntity, String> {
    public List<MongoTestEntity> findByFirstName(String firstName);
}

When you use the repository style, Spring automatically registers a bean with the container using the values defined in application.properties.

Spring MongoDB Template

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Example from the docs
@Configuration
class AppConfig {

  @Bean
  MongoClient mongoClient() {
      return MongoClients.create("mongodb://localhost:27017");
  }

  @Bean
  MongoTemplate mongoTemplate(MongoClient mongoClient) {
      return new MongoTemplate(mongoClient, "geospatial");
  }
}

With MongoTemplate, you register the bean directly in the configuration class.

Basic CRUD Test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@SpringBootTest
class MongoTestRepositoryTest {
    @Autowired
    private MongoTestRepository mongoTestRepository;

    @DisplayName("saveTest")
    @Test
    public void saveTest() {
        MongoTestEntity mongoTestEntity = new MongoTestEntity("choi", "XX");
        MongoTestEntity insertedEntity = mongoTestRepository.insert(mongoTestEntity);
    }

    @DisplayName("deleteTest")
    @Test
    public void deleteTest() {
        List<MongoTestEntity> findList = mongoTestRepository.findByFirstName("choi");
        mongoTestRepository.deleteAll(findList);
    }

    @DisplayName("updateTest")
    @Test
    public void updateTest() {
        MongoTestEntity mongoTestEntity = new MongoTestEntity("jeon", "XX");
        MongoTestEntity inserted = mongoTestRepository.insert(mongoTestEntity);
        inserted.setFirstName("choi");
        mongoTestRepository.save(inserted);
        //insert throws an exception if the _id already exists
        //save updates the document if the _id already exists
    }

    @DisplayName("findTest")
    @Test
    public void findTest() {
        List<MongoTestEntity> findList = mongoTestRepository.findByFirstName("choi");
    }
}

To use transactions with Spring MongoDB, you need to register additional beans such as a TransactionManager/Template.

Spring MongoDB operates synchronously by default; to use it asynchronously, use MongoDB Reactive instead.

References

https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.repositories

https://www.baeldung.com/spring-data-mongodb-connection

https://jh2021.tistory.com/24

https://ckddn9496.tistory.com/100

This post is licensed under CC BY-NC 4.0 by the author.