Spring Data MongoDB (Optional)

Introduction

Spring Data MongoDB maps Java objects to BSON documents with @Document, MongoRepository, and declarative queries—similar to JPA for relational databases. This optional chapter gives a thin Spring Boot 3 example and links to the main Spring Boot track for everything outside MongoDB.

Prerequisites

Dependency

pom.xml:

xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

application.yml:

yaml
spring:
  data:
    mongodb:
      uri: mongodb://127.0.0.1:27017/hello_demo

Atlas: use mongodb+srv://...MongoDB Atlas.

Document Model

Post.java:

Code explanation:

  • @Id maps to _id (String accepts ObjectId hex or lets MongoDB generate)
  • @Indexed(unique = true) creates index at startup (or use explicit index definitions)

Repository

PostRepository.java:

Spring generates query implementations from method names—like JPA findBy....

REST Controller Sketch

Compare Spring Boot MVC and routing.

Custom Queries With @Query

java
@Query("{ 'tags': ?0, 'published': true }")
List<Post> findPublishedByTag(String tag);

JSON in @Query mirrors mongosh filters — Query Operators.

Transactions

Enable replica set, then:

java
@Transactional
public void transferInventory(String fromSku, String toSku, int qty) {
    // multiple MongoTemplate / repository calls in one transaction
}

@Transactional requires MongoDB 4.0+ replica set — Transactions chapter. Contrast MySQL transactions.

Embedded vs Referenced in Java

Embed value objects:

java
public class Comment {
    private String author;
    private String body;
    private Instant createdAt;
}
 
// inside Post
private List<Comment> comments;

Reference by id when comments grow unbounded — Embedded vs Referenced.

Warning

Do not embed unbounded comments on viral posts—use a separate Comment @Document with postId.

Testing

Use Testcontainers MongoDBContainer or embedded Mongo for CI—see generated tests in First Spring Boot Project.

FAQ

Spring Data MongoDB vs MySQL JPA?

Same Spring patterns; MongoDB skips JOINs—model for your queries. Relational reporting often stays on MySQL.

Redis caching?

@Cacheable with Redis — Spring Boot Redis and Performance.

Kotlin?

Spring Data MongoDB works with Kotlin data classes—add kotlin-reflect.

Migration tool?

Mongock or application scripts; no Flyway-style SQL. Use schemaVersion field in documents — Common Modeling Patterns.

Security?

SCRAM users, TLS, input validation — MongoDB Security.