6장: MongoDB 고급 쿼리
Chapter 6: MongoDB의 고급 쿼리 활용법
MongoDB를 실무에서 최대한 효과적으로 사용하려면, 기본적인 CRUD 명령을 넘어서 더 복잡하고 다양한 쿼리를 다룰 필요가 있다. 고급 쿼리 기법은 대량의 데이터를 빠르게 찾고, 조건에 맞는 데이터를 다양하게 가공해내는 데 핵심적인 역할을 한다. 이 장에서는 MongoDB에서 자주 활용되는 고급 쿼리 기법과 쿼리 성능을 최적화하는 전략, 그리고 집계 파이프라인의 활용법까지 실제 예시 중심으로 정리한다.
복잡한 검색 조건 다루기
MongoDB는 단순한 값 일치뿐 아니라, 여러 조건을 조합한 쿼리를 지원한다. $and
, $or
, $nor
, $not
같은 논리 연산자를 쓰면 다양한 필드의 조합 조건을 자유롭게 구현할 수 있다. 또한 $in
, $nin
, $exists
, $type
등 특수 연산자도 풍부하게 제공되어, 데이터의 존재 여부나 특정 타입의 자료만을 선별할 수 있다.
예를 들어, 나이가 30 이상이면서 이메일이 존재하는 사용자만 필터링할 때는 다음과 같은 쿼리가 가능하다.
db.users.find({
$and: [
{ age: { $gte: 30 } },
{ email: { $exists: true } }
]
})
또한 배열이나 중첩된 문서를 대상으로 $elemMatch
나 dot notation을 활용해 복잡한 데이터 구조에서도 손쉽게 원하는 정보를 뽑아낼 수 있다.
Projection과 정렬, 페이징
여러 필드 중 일부만 조회하고 싶을 때 projection 옵션을 사용하면 된다. _id
필드를 제외하고 이름과 나이만 보고 싶다면 다음과 같다.
db.users.find({}, { name: 1, age: 1, _id: 0 })
정렬을 적용하려면 sort()
를, 페이지네이션에는 skip()
과 limit()
을 함께 활용할 수 있다. 데이터가 수천 건 넘어가는 상황에서도 효율적으로 결과를 다룰 수 있게 된다.
인덱스를 활용한 쿼리 최적화
복잡한 쿼리를 빠르게 처리하기 위해 가장 중요한 개념 중 하나가 바로 인덱스다. 자주 조회하거나 정렬하는 필드에는 인덱스를 설정하면 MongoDB가 방대한 문서들 중 필요한 내용을 훨씬 빠르게 찾을 수 있다. 인덱스가 적용된 필드는 쿼리 실행 단계를 대폭 줄여주기 때문에, 실무 환경에서는 반드시 필요한 항목에만 신중하게 인덱스를 부여해야 한다.
db.users.createIndex({ age: 1 })
불필요한 인덱스는 쓰기 성능을 떨어뜨릴 수 있으므로 주기적으로 인덱스의 효과를 점검하여 관리할 필요가 있다.
집계 프레임워크와 분석 작업
MongoDB의 집계(Aggregation) 프레임워크는 대량의 데이터를 여러 단계로 가공·분석하며, 복잡한 통계나 리포트도 쉽게 추출할 수 있도록 설계되어 있다. aggregate()
명령을 사용하며, 파이프라인 형태로 각 단계별 처리 과정을 명확히 기술할 수 있다.
가장 기본적인 집계 파이프라인은 $match
로 조건을 걸고, $group
으로 원하는 키별 집계, $sort
로 정렬, $project
로 출력 필드를 조정한다. 실전에서는 $unwind
, $lookup
등 다양한 단계 연산자를 활용해 복합적인 분석도 가능하다.
예를 들어, 등록된 사용자 수를 나이대별로 집계하려면 다음과 같은 쿼리를 작성할 수 있다.
db.users.aggregate([
{ $group: { _id: "$age", count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
])
복잡한 실무 통계나 리포팅도 몽고디비의 집계 프레임워크만으로 간결하면서 강력하게 처리할 수 있다.
쿼리 최적화와 실행계획
MongoDB는 쿼리 실행 시 내장 최적화 엔진이 여러 실행 방식을 비교해 가장 효율적인 경로를 선택한다. explain()
명령을 활용하면 쿼리가 실제로 어떻게 실행되는지, 인덱스를 활용했는지, 얼마나 많은 도큐먼트가 스캔됐는지 등의 실행 계획을 한 눈에 파악할 수 있다.
db.users.find({ age: { $gt: 25 } }).explain("executionStats")
이 정보를 바탕으로 필요 없는 풀 스캔을 줄이고, 쿼리 구조나 인덱스 전략을 개선할 수 있다. 대용량 작업이나 자주 호출되는 쿼리라면 반드시 주기적으로 실행 계획을 점검해야 한다.
마치며
고급 쿼리 기술은 개발자의 자유도를 비약적으로 높여준다. 다양한 실무 요구에 따라 복합적인 조건, 집계, 최적화 방법을 익혀두면 MongoDB가 제공하는 진정한 생산성과 확장성을 끌어낼 수 있다. 실전에서는 각 상황에 맞는 쿼리 언어 습득과 주기적인 성능 점검이 무엇보다 중요하다는 점을 명심하자.


