MongoDB 집계 연산자
2026년 8월 28일
MongoDB 집계 연산자
- MongoDB Aggregation Pipeline이 stage의 나열이라면, 이 노트는 그 stage 안에서 쓰는 표현식과 누산기다.
- 규칙 하나만 알면 된다:
"$필드명"은 "그 필드의 값" 이라는 뜻이다.
JavaScript
$group 누산기
JavaScript
| 누산기 | 뜻 |
|---|---|
$sum: 1 | 개수 세기 (SQL COUNT(*)) |
$sum: "$필드" | 합계 |
$avg $min $max | 평균·최소·최대 |
$push | 값을 배열로 모두 모음 |
$addToSet | 중복 없이 모음 |
$first $last | 그룹의 첫/마지막 값 ($sort 후에 의미가 생긴다) |
_id: null이면 전체를 하나로 묶는다.
Mermaid스크롤로 확대 · 드래그로 이동
$project — 필드를 계산해서 만들기
JavaScript
| 표현식 | 뜻 |
|---|---|
$ifNull: ["$a", 기본값] | 필드가 없을 때 대체 — 스키마 없는 DB에서 필수 |
$size | 배열 길이 |
$concat $toUpper $substr | 문자열 |
$eq $gt $and | 비교·논리 (결과가 boolean 값) |
$cond: [조건, 참값, 거짓값] | 삼항 연산 |
$dateToString | 날짜 포맷 |
$addFields는 기존 필드를 유지한 채 더하기만 한다. $project는 나열한 것만 남긴다.
$unwind — 배열을 행으로 펼치기
JavaScript
블록 3개가 각각 키워드 5개면 → 15개 문서가 된다. "가장 많이 쓰인 키워드" 같은 집계가 이렇게 나온다.
빈 배열이면 문서가 사라진다. 남기려면 { $unwind: { path: "$keywords", preserveNullAndEmptyArrays: true } }.
$lookup — 다른 컬렉션 붙이기
JavaScript
LEFT JOIN에 해당하지만 비싸다. 대상 컬렉션의 조인 필드에 인덱스가 없으면 문서마다 풀 스캔(Full Scan)이다. 자주 같이 읽는 데이터라면 애초에 임베드하는 게 맞다.
$facet — 한 번에 여러 집계
JavaScript
대시보드처럼 같은 데이터로 여러 통계를 낼 때 왕복을 한 번으로 줄인다.
순서가 성능의 전부다
JavaScript
$match·$sort는 맨 앞에 있어야 인덱스를 쓴다.$group·$unwind를 지나면 그건 인덱스가 없는 중간 결과다.$project로 필요 없는 필드를 일찍 버리면 뒤 stage가 다룰 데이터가 줄어든다.
한 줄 정리
"$필드"는 값 참조, $group은 묶어 누적, $project는 계산해 만들기. $match를 맨 앞에 두는 것이 성능의 전부다.
관련
- MongoDB Aggregation Pipeline
- MongoDB 쿼리 연산자
- MongoDB 배열 쿼리
- MongoDB 데이터 모델링
- 인덱스(Index)
- SQL 실행 순서
- MongoDB MOC