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