Spring BootでMongo DBを荷恬する

峻さん、こんにちは。晦永蝕kグル`プの稼-看噛温敬温稼です。
噴屈屶の扮震では、怜の震は11扮゛13扮とされています。その蕁◆胡怜々や仝怜念?怜朔々などのように、怜に咀んだ査忖が聞われています。

云籾です。
MongoDBは謹くの冱Zに鬉靴討り、その嶄でもJavaScriptとはH才來が互いです。とはいえ、バックエンド箸Java冱ZでBしているシステムは謹いのではないでしょうか。書指はJava冱Z、蒙にSpring Boot (+Gradle)でMongoDBを荷恬する圭隈をB初します。

Spring Boot で Mongo DB

扮牽譜協指り

1からプロジェクトを恬撹する魁栽は、の鮫中嘔箸砲△誨栖肅vSから、仝Spring Data MongoDB々を弖紗して恬撹した圭が壼いです。貌た兆念で仝Mongo DB々がありますが、Spring Dataが戻工するクラス吉が聞えないので廣吭が駅勣です。

屡贋のプロジェクトで珂看稼乙看禽京を荷恬したい魁栽は、build.gradleの卆贋vSに參和を弖紗します。

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
	testImplementation 'org.springframework.boot:spring-boot-starter-data-mongodb-test'
    // 麿福待
}

application.propertiesに俊A枠の雨檎鴛を峺協します。

spring.mongodb.uri=mongodb://localhost:27017/demo?directConnection=true

參貧で扮犬屁いました。

MongoRepository

珂看稼乙看禽京を荷恬する圭隈は2つあります。まずはMongoRepositoryを聞った圭隈を府初します。

珂看糸艶鉛クラス

ドキュメントのモデルクラスを協吶します。@Document(collection = "users")で鯉追枠のコレクション兆を峺協します。

package com.example.demo.models;

import java.time.LocalDateTime;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Data;

// ユ`ザ`秤鵑魃3屬垢襯皀妊襯ラス
@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;
	}
}

檎艶沿看壊庄岳看姻霞クラス

MongoRepositoryを@覚した、珂看稼乙看禽京にアクセスするためのリポジトリインタ`フェ`スを協吶します。

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

遺看稼岳姻看鉛鉛艶姻クラス

協吶したリポジトリインタ`フェ`スを聞って珂看稼乙看禽京を荷恬します。

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

        // 碧Y惚を猟忖双にQして卦す
        return users.stream()
                .map(User::toString)
                .collect(Collectors.joining(", "));
    }
}

この圭隈のメリットはコ`ドが酒準であり、辛i來が互いことにあります。デメリットとしては、鹸jな碧や鹿柴I尖を燕屬垢襪里墨渊腓あることでしょうか。

サンプルをg佩すると參和のドキュメントが恬撹されます。

[
  {
    _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

より悲罷に碧や鹿柴I尖を佩いたい魁栽はMongoTemplateを聞います。モデルクラスもリポジトリクラスも勣りません。MongoTemplateだけで珂看稼乙看禽京を荷恬することができます。

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();

        // 碧Y惚を猟忖双にQして卦す
        return documents.stream()
                .map(Document::toJson)
                .collect(Collectors.joining(", "));
    }
}

MongoRepositoryに曳べて辛i來が和がりますが、より悲罷な碧が佩えるようになります。

おわりに

MongoRepositoryでは、ドキュメントのフィ`ルドがモデルクラスに卆贋するため、珂看稼乙看禽京の隔つスキ`マレスなドキュメントを恬撹することができません。とはいえ、スキ`マレスだからと冱ってなんでも徭喇にドキュメントを恬撹すると、ドキュメント寂の由匯來やv銭來がなくなり、隠便來が寄きく鱒なわれます。

g縞の蝕kではMongoRepositoryでドキュメントの恬撹や酒gな碧吉を佩いつつ、鹸jな碧や鹿柴I尖などをMongoTemplateで佩うなど、聞い蛍けながら蝕kすることになるかと房います。

ではたま。


Recommendおすすめブログ