Skip to content

집계 파이프라인 (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는 파이프라인이라는 다른 문법으로 같은 일을 한다고 보면 돼요.

더 알아보기