Spring BootでMongo DBを操作する
皆さん、こんにちは。LP開発グループのn-ozawanです。
十二支の時刻では、午の刻は11時~13時とされています。その為、「正午」や「午前・午後」などのように、午に因んだ漢字が使われています。
本題です。
MongoDBは多くの言語に対応しており、その中でもJavaScriptとは親和性が高いです。とはいえ、バックエンド側をJava言語で構築しているシステムは多いのではないでしょうか。今回はJava言語、特にSpring Boot (+Gradle)でMongoDBを操作する方法を紹介します。
目次
Spring Boot で Mongo DB
準備(設定回り)
1からプロジェクトを作成する場合は、Spring Initializrの画面右側にある依存関係から、「Spring Data MongoDB」を追加して作成した方が早いです。似た名前で「Mongo DB」がありますが、Spring Dataが提供するクラス等が使えないので注意が必要です。

既存のプロジェクトでMongoDBを操作したい場合は、build.gradleの依存関係に以下を追加します。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
testImplementation 'org.springframework.boot:spring-boot-starter-data-mongodb-test'
// 他省略
}application.propertiesに接続先のURIを指定します。
spring.mongodb.uri=mongodb://localhost:27017/demo?directConnection=true以上で準備が整いました。
MongoRepository
MongoDBを操作する方法は2つあります。まずはMongoRepositoryを使った方法を紹介します。
Modelクラス
ドキュメントのモデルクラスを定義します。@Document(collection = "users")で格納先のコレクション名を指定します。
package com.example.demo.models;
import java.time.LocalDateTime;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Data;
// ユーザー情報を保持するモデルクラス
@Data
@Document(collection = "users")
public class User {
private String id;
private String username;
private String email;
private String passwordHash;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public User() {
this.createdAt = LocalDateTime.now();
this.updatedAt = this.createdAt;
}
public User(String username) {
this.username = username;
this.createdAt = LocalDateTime.now();
this.updatedAt = this.createdAt;
}
}Repositoryクラス
MongoRepositoryを継承した、MongoDBにアクセスするためのリポジトリインターフェースを定義します。
package com.example.demo.repository;
import java.util.List;
import com.example.demo.models.User;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface UserRepository extends MongoRepository<User, String> {
public List<User> findByUsername(String username);
}Controllerクラス
定義したリポジトリインターフェースを使ってMongoDBを操作します。
package com.example.demo;
import com.example.demo.models.User;
import com.example.demo.repository.UserRepository;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private UserRepository userRepository;
@GetMapping("/hello")
public String hello() {
// ユーザーコレクションをクリアしてから新しいユーザーを保存
userRepository.deleteAll();
userRepository.save(new User("n-ozawan"));
// "n-ozawan" というユーザー名でユーザーを検索
List<User> users = userRepository.findByUsername("n-ozawan");
// 検索結果を文字列に変換して返す
return users.stream()
.map(User::toString)
.collect(Collectors.joining(", "));
}
}この方法のメリットはコードが簡潔であり、可読性が高いことにあります。デメリットとしては、複雑な検索や集計処理を表現するのに限界があることでしょうか。
サンプルを実行すると以下のドキュメントが作成されます。
[
{
_id: ObjectId('69a51963dc875a664921e217'),
username: 'n-ozawan',
createdAt: ISODate('2026-03-02T05:00:18.977Z'),
updatedAt: ISODate('2026-03-02T05:00:18.977Z'),
_class: 'com.example.demo.models.User'
}
]MongoTemplate
より柔軟に検索や集計処理を行いたい場合はMongoTemplateを使います。モデルクラスもリポジトリクラスも要りません。MongoTemplateだけでMongoDBを操作することができます。
package com.example.demo;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.bson.Document;
import org.springframework.data.mongodb.core.query.Query;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;
@RestController
public class Hello2Controller {
@Autowired
private MongoTemplate mongoTemplate;
@GetMapping("/hello2")
public String hello2() {
// MongoDBにドキュメントを挿入してから検索する例
Document doc = new Document("message", "Hello from MongoDB!")
.append("hoge", new Document("fuga", 123));
// コレクションを一旦クリアしてから新しいドキュメントを挿入
mongoTemplate.dropCollection("greetings");
mongoTemplate.insert(doc, "greetings");
// "message" フィールドが "Hello from MongoDB!" であるドキュメントを検索
Query query = query(where("message").is("Hello from MongoDB!"));
query.fields().include("message").exclude("_id");
List<Document> documents = mongoTemplate.query(Document.class)
.inCollection("greetings")
.matching(query).all();
// 検索結果を文字列に変換して返す
return documents.stream()
.map(Document::toJson)
.collect(Collectors.joining(", "));
}
}MongoRepositoryに比べて可読性が下がりますが、より柔軟な検索が行えるようになります。
おわりに
MongoRepositoryでは、ドキュメントのフィールドがモデルクラスに依存するため、MongoDBの持つスキーマレスなドキュメントを作成することができません。とはいえ、スキーマレスだからと言ってなんでも自由にドキュメントを作成すると、ドキュメント間の統一性や関連性がなくなり、保守性が大きく損なわれます。
実際の開発ではMongoRepositoryでドキュメントの作成や簡単な検索等を行いつつ、複雑な検索や集計処理などをMongoTemplateで行うなど、使い分けながら開発することになるかと思います。
ではたま。
