집계 파이프라인 (Aggregation Pipeline)¶
개요¶
집계(aggregation)는 여러 문서를 처리해서 계산된 결과를 돌려주는 연산이에요. 단순히 문서 하나를 조회하는 게 아니라, 여러 문서의 값을 묶고(group) 계산하는 작업이죠. 언제 쓰면 좋은지 공식 문서는 네 가지를 들어요 — 여러 문서에서 값을 그룹화하기, 그룹화한 데이터로 단일 결과 계산하기, 시간에 따른 데이터 변화 분석하기, 최신 버전 데이터 조회하기.
MongoDB에서 집계를 수행하는 방법은 두 가지예요. 집계 파이프라인(권장)과 기능이 더 제한된 단일 목적 집계 메서드(count, distinct)입니다.
핵심 개념¶
파이프라인은 '단계(stage)'의 연속¶
집계 파이프라인은 하나 이상의 스테이지(stage)로 이뤄져요. 각 스테이지는 입력 문서에 어떤 연산을 수행하고, 그 결과를 다음 스테이지에 넘겨요. 마치 조립 라인처럼 문서가 스테이지를 차례대로 통과하면서 걸러지고·묶이고·계산되는 구조예요.
대표적인 스테이지는 다음과 같아요.
$match— 조건에 맞는 문서만 걸러내요. 조기 필터링이라 파이프라인 앞쪽에 두면 성능에 좋아요.$unwind— 배열 필드를 풀어서, 배열의 각 요소를 각각의 문서로 펼쳐요.$group— 특정 필드 값으로 문서를 묶고,$sum같은 연산자로 값을 계산해요.$sort— 결과를 정렬해요.$limit— 결과 개수를 제한해요.
파이프라인은 기본적으로 문서를 바꾸지 않는다¶
db.collection.aggregate()로 파이프라인을 돌려도, 파이프라인에 $merge나 $out 스테이지가 없다면 컬렉션의 문서는 수정되지 않아요. 결과만 새로 만들어낼 뿐이죠. 문서를 업데이트하려면 $merge/$out을 쓰거나 전용 업데이트 파이프라인을 써요.
예시 — 감독별 영화 수 상위 3명¶
감독 배열을 풀고(\(unwind), 감독 이름으로 묶어 영화 수를 세고(\)group), 내림차순 정렬 후(\(sort) 세 개만 가져오는(\)limit) 흐름이에요. 이 파이프라인이 문서를 어떻게 좁혀 가는지가 집계의 핵심이에요.
실제 적용 (데이터스케쳐스)¶
집계는 문서형 데이터에서 통계·요약이 필요할 때 힘을 발휘해요.
- 콘텐츠 집계 — 수많은 노트·캔버스 요소에서 태그별 개수, 작성자별 콘텐츠 수 같은 요약을 파이프라인으로 뽑아요.
- 시간별 분석 — 생성 시각 필드로 묶어 일별·주별 생성 추이를 계산해요. 시간에 따른 변화 분석이 집계의 대표 목적이에요.
$unwind+$group— 배열로 된 태그·참여자를 풀어서 등장 빈도를 세는 패턴을 자주 써요.
컬렉션이 커지면 파이프라인의 $match 같은 필터는 인덱스의 도움을 받아요. 그래서 집계와 인덱스는 함께 설계해야 해요. PostgreSQL이 SQL로 통계를 내는 것처럼, MongoDB는 파이프라인이라는 다른 문법으로 같은 일을 한다고 보면 돼요.
더 알아보기¶
- 공식 문서 (1차)
- 집계 연산 (Aggregation Operations) — mongodb.com/docs/manual/aggregation
- 파이프라인 스테이지 — mongodb.com/docs/manual/reference/operator/aggregation-pipeline
- 집계 파이프라인 예시 — mongodb.com/docs/manual/core/aggregation-pipeline
- 큐레이션/블로그 (2차)
- MongoDB 공식 블로그 — mongodb.com/blog