MongoDBのインストールと操作ガイド

1. MongoDBのインストール

1.1 Dockerを使用したインストール

docker run --restart=always -d --name mongo -v /opt/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6

1.2 クライアントツール

  • MongoDB Compass
  • MongoDB CLI

2. MongoDBの操作

2.1 必要な依存関係の追加

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

2.2 MongoDB接続設定

# MongoDB接続設定
spring.data.mongodb.host=192.168.23.27
spring.data.mongodb.port=27017
spring.data.mongodb.database=mall
spring.data.mongodb.auto-index-creation=true

2.3 モデルクラスUserの定義

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.FieldType;
import org.springframework.data.mongodb.core.index.ExpireAfter;
import org.springframework.data.mongodb.core.index.Indexed;

import java.time.LocalDateTime;

@Data
@Document(collection = "user_profile")
public class User {
    @Id
    private String userId;

    @Field(targetType = FieldType.INT32)
    private Integer numericId;

    private String fullName;

    @Field(targetType = FieldType.INT32)
    private Integer userAge;

    private String contactNumber;

    @Indexed(expireAfterSeconds = 10)
    private LocalDateTime createdAt;
}

2.4 ドキュメントの挿入

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
class InsertOperationsTest {
    @Autowired
    private MongoTemplate template;

    @Test
    void 単一ドキュメント挿入() {
        User user = new User();
        user.setUserId("U1001");
        user.setNumericId(101);
        user.setFullName("山田太郎");
        user.setUserAge(28);
        user.setContactNumber("080-1234-5678");
        user.setCreatedAt(LocalDateTime.now());

        User result = template.insert(user, "user_profile");
        assertThat(result).isNotNull();
    }

    @Test
    void 複数ドキュメント一括挿入() {
        List<User> users = new ArrayList<>();

        for (int i = 1; i <= 5; i++) {
            User user = new User();
            user.setUserId("U100" + i);
            user.setNumericId(100 + i);
            user.setFullName("ユーザー" + i);
            user.setUserAge(25 + i);
            user.setContactNumber("080-1111-2222");
            user.setCreatedAt(LocalDateTime.now());
            users.add(user);
        }

        List<User> results = template.insertAll(users);
        assertThat(results).hasSize(5);
    }
}

2.5 ドキュメントの更新

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
class UpdateOperationsTest {
    @Autowired
    private MongoTemplate template;

    @Test
    void 条件に一致する最初のドキュメントを更新() {
        Query query = new Query(Criteria.where("numericId").is(101));
        Update update = new Update().set("userAge", 29);

        template.updateFirst(query, update, User.class);
    }

    @Test
    void 複数ドキュメントを更新() {
        Query query = new Query(Criteria.where("userAge").gte(27));
        Update update = new Update().set("fullName", "アップデート済");

        template.updateMulti(query, update, User.class);
    }
}

2.6 ドキュメントの削除

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
class DeleteOperationsTest {
    @Autowired
    private MongoTemplate template;

    @Test
    void 特定条件のドキュメント削除() {
        Query query = new Query(Criteria.where("fullName").regex("ユーザー"));
        template.remove(query, User.class);
    }
}

2.7 ドキュメントの検索

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.domain.Sort;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
class QueryOperationsTest {
    @Autowired
    private MongoTemplate template;

    @Test
    void 全件取得() {
        List<User> users = template.findAll(User.class);
        assertThat(users).isNotEmpty();
    }

    @Test
    void 条件付き検索() {
        Query query = new Query(Criteria.where("userAge").gte(25).lte(30))
                      .with(Sort.by(Sort.Order.desc("userAge")));
                      
        List<User> users = template.find(query, User.class);
        assertThat(users).isNotEmpty();
    }
}

2.8 インデックス操作

import com.mongodb.client.model.Indexes;
import org.bson.Document;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
class IndexOperationsTest {
    @Autowired
    private MongoTemplate template;

    @Test
    void インデックス作成() {
        String indexName = template.getCollection("user_profile")
                                  .createIndex(Indexes.ascending("fullName"));
        assertThat(indexName).isNotNull();
    }

    @Test
    void インデックス一覧取得() {
        template.getCollection("user_profile")
                .listIndexes()
                .forEach((Document doc) -> System.out.println(doc.toJson()));
    }
}

タグ: MongoDB Docker mongo-template spring-data-mongodb indexes

7月12日 18:35 投稿