MongoDB 쿼리 사용법 가이드 (by MongoTemplate)
MongoDB는 JSON 형식의 데이터를 손쉽게 다룰 수 있는 NoSQL 데이터베이스로, CRUD 작업 및 고급 쿼리 기능을 제공합니다. 이번 글에서는 MongoDB의 데이터 삽입, 조회, 수정, 삭제 같은 기본 쿼리부터 조건 필터링, 정렬, 집계 쿼리까지 다양한 예제를 통해 MongoDB 쿼리 사용법을 알아보겠습니다.
기본 설정 및 컬렉션 접근
데이터 조회와 조작에 앞서, 먼저 MongoDB와 연결을 설정하고 컬렉션을 선택하는 예제입니다.
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
MongoDatabase database = mongoClient.getDatabase("exampleDb");
MongoCollection<Document> collection = database.getCollection("sampleCollection");
MongoTemplate을 설정하고 기본 컬렉션에 접근
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.beans.factory.annotation.Autowired;
@Autowired
private MongoTemplate mongoTemplate;
MongoDB CRUD 작업 예제
MongoDB의 기본적인 CRUD 작업을 살펴보겠습니다.
데이터 삽입 (Insert)
단일 문서와 다중 문서를 컬렉션에 삽입하는 방법입니다.
// 단일 문서 삽입
MyDto document = new MyDto("Alice", 25, "Seoul");
mongoTemplate.insert(document, "sampleCollection");
// 다중 문서 삽입
List<MyDto> documents = Arrays.asList(
new MyDto("Bob", 30, "Busan"),
new MyDto("Charlie", 35, "Incheon")
);
mongoTemplate.insert(documents, "sampleCollection");
데이터 조회 (Read)
조건에 맞는 데이터를 조회할 때는 Query와 Criteria를 활용하여 필요한 필터를 작성합니다.
조건에 맞는 데이터를 조회할 때 find() 메서드를 사용합니다. 예를 들어, age가 25 이상인 데이터를 조회하려면 다음과 같이 합니다.
// age가 25 이상인 데이터를 조회
Query query = new Query(Criteria.where("age").gte(25));
List<MyDto> results = mongoTemplate.find(query, MyDto.class, "sampleCollection");
데이터 수정 (Update)
데이터 수정을 위해 updateFirst()나 updateMulti() 메서드를 사용할 수 있습니다. 예를 들어, name이 "Alice"인 문서의 age를 26으로 업데이트하는 예제입니다.
Query query = new Query(Criteria.where("name").is("Alice"));
Update update = new Update().set("age", 26);
mongoTemplate.updateFirst(query, update, "sampleCollection");
데이터 삭제 (Delete)
데이터 삭제 시 remove() 메서드를 사용해 조건에 맞는 문서를 제거할 수 있습니다.
Query query = new Query(Criteria.where("name").is("Charlie"));
mongoTemplate.remove(query, MyDto.class, "sampleCollection");
AND, OR 조건 조합
Criteria의 andOperator와 orOperator를 활용해 여러 조건을 결합할 수 있습니다. 예를 들어, age가 25 이상이고 city가 "Seoul"인 데이터를 조회할 수 있습니다.
Query query = new Query(
new Criteria().andOperator(
Criteria.where("age").gte(25),
Criteria.where("city").is("Seoul")
)
);
List<MyDto> results = mongoTemplate.find(query, MyDto.class, "sampleCollection");
정렬과 결과 제한
조회 결과를 특정 필드 기준으로 정렬하고, 필요한 만큼만 가져올 때는 with()와 limit()을 사용합니다.
Query query = new Query()
.with(Sort.by(Sort.Direction.DESC, "age")) // age 기준 내림차순 정렬
.limit(5); // 상위 5개 문서만 반환
List<MyDto> results = mongoTemplate.find(query, MyDto.class, "sampleCollection");
집계 쿼리 (Aggregation)
Spring Data MongoDB의 Aggregation을 사용해 다양한 집계 작업을 수행할 수 있습니다. 예를 들어, 각 city별로 평균 age를 계산하는 집계 예제입니다.
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.group("city").avg("age").as("averageAge")
);
AggregationResults<Document> results = mongoTemplate.aggregate(
aggregation, "sampleCollection", Document.class
);
for (Document doc : results) {
System.out.println(doc.toJson());
}