MongoDB 집계 파이프라인
MongoDB 집계 파이프라인 (Aggregation Pipeline)
여러 도큐먼트를 조합해 그룹별 통계를 내거나, 필드를 재구성해 새로운 값을 계산해야 할 때가 있어요. MongoDB의 집계 파이프라인(aggregation pipeline)은 이런 작업을 스테이지(stage)라는 단계를 차례로 연결해 처리하게 해주는 도구예요. 각 스테이지는 입력 도큐먼트에 연산을 적용하고, 그 결과가 다음 스테이지의 입력이 됩니다.
파이프라인이란
집계 파이프라인은 하나 이상의 스테이지로 구성돼요. 각 스테이지는 입력 도큐먼트에 특정 연산을 수행하는데, 예를 들어 $filter로 도큐먼트를 걸러내고, $group으로 도큐먼트를 묶으면서 값을 계산할 수 있어요. 도큐먼트는 컬렉션, 뷰, 또는 특별히 설계된 스테이지에서 올 수 있습니다.
파이프라인은 도큐먼트 그룹에 대한 결과를 반환할 수 있고, 앞으로 나올 "업데이트" 방식으로 도큐먼트 수정에도 쓰일 수 있어요. 다만 db.collection.aggregate() 메서드로 돌리는 파이프라인은 파이프라인 안에 $merge나 $out 스테이지가 있지 않은 한 컬렉션의 도큐먼트를 직접 수정하지 않아요.
스테이지의 특징
몇 가지 특징을 짚어볼게요.
- 스테이지는 입력 도큐먼트마다 반드시 하나의 출력 도큐먼트를 내야 하는 게 아니에요. 어떤 스테이지는 새 도큐먼트를 만들고, 어떤 스테이지는 도큐먼트를 걸러내기도 해요.
- 같은 스테이지를 파이프라인에 여러 번 쓸 수 있어요. 다만
$out,$merge,$geoNear는 예외로 한 번만 사용할 수 있어요.
표현식과 연산자
집계 파이프라인에서 표현식(expression)은 각 스테이지가 입력 도큐먼트를 어떻게 처리할지 정의해요. 어떤 도큐먼트를 포함할지, 필드를 어떻게 재구성할지, 새 값을 어떻게 계산할지 같은 것들이 표현식으로 표현되죠. MongoDB 쿼리 언어에서 표현식은 다음 요소로 구성할 수 있어요.
| 구성 요소 | 예시 |
|---|---|
| 상수(constant) | 3 |
| 연산자(operator) | $add |
| 필드 경로 표현식 | "$<path.to.field>" |
예를 들어 { $add: [ 3, "$inventory.total" ] }는 $add 연산자와 두 피연산자로 이뤄진 표현식이에요. 하나는 상수 3이고, 다른 하나는 필드 경로 표현식 "$inventory.total"이죠. 이 표현식은 입력 도큐먼트의 inventory.total 값에 3을 더한 결과를 돌려줘요.
필드 경로
필드 경로(field path) 표현식은 입력 도큐먼트의 필드에 접근할 때 써요. 필드 이름 앞에 달러 기호 $를 붙이면 돼요. "$user"는 user 필드를, "$user.name"은 내장된 user.name 필드를 가리킵니다.
파이프라인 실행과 도큐먼트 업데이트
파이프라인을 실행할 때는 db.collection.aggregate() 메서드나 aggregate 커맨드를 사용해요. MongoDB Atlas UI에서도 파이프라인을 실행할 수 있는데, 이 경우 각 스테이지의 결과를 미리 보면서 단계별로 확인할 수 있어요.
집계 파이프라인은 조회만 하는 게 아니라 도큐먼트 업데이트에도 쓸 수 있어요. db.collection.findOneAndUpdate()나 db.collection.findAndModify()와 같은 메서드와 함께 파이프라인 기반 업데이트를 적용할 수 있습니다.
참고할 만한 제약
- 한계: 값 타입과 결과 크기에 대한 제한은 집계 파이프라인 한계 문서에서 확인할 수 있어요.
- 샤딩 컬렉션: 집계 파이프라인은 샤딩된 컬렉션에 대한 연산도 지원해요.