📘 MongoDB Aggregation 문법 완전 정리
MongoDB의 Aggregation Framework는 데이터 분석과 집계 처리에 특화된 강력한 기능입니다. 데이터를 그룹화하고, 정렬하고, 필터링하고, 변형하는 데 사용됩니다.
🔍 Aggregation 이란?
여러 Document를 묶어(Grouping), 원하는 형태로 가공한 후 하나의 결과로 출력하는 방식입니다.
- MongoDB에서 SQL의 GROUP BY, JOIN, HAVING 같은 연산을 대체합니다.
- 복잡한 데이터 분석, 통계, 리포트를 만들 때 필수로 활용됩니다.
🧱 Aggregation Pipeline 핵심 개념
구성 요소 설명
Pipeline | 여러 단계로 구성된 데이터 처리 흐름 |
Stage | $match, $group, $sort 등 개별 처리 단계 |
Operators | $avg, $sum, $count, $min, $max 등 수학 및 변환 연산자 |
🧠 MongoDB Aggregation Pipeline 예제 분석 위의 표 기준
다음은 orders 컬렉션에 대해 Aggregation Pipeline을 적용한 사례로, 고객별(cust_id)로 상태가 'A'인 주문의 amount를 합산하여 반환하는 과정입니다.
📌 사용된 쿼리
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
🔄 전체 흐름 요약
단계 설명
$match | 조건 필터링 → status가 "A"인 문서만 통과시킴 |
$group | cust_id별 그룹화 → amount를 합산하여 total 계산 |
📂 단계별 데이터 흐름
🗃 원본 데이터 (orders 컬렉션)
[
{ cust_id: "A123", amount: 500, status: "A" },
{ cust_id: "A123", amount: 250, status: "A" },
{ cust_id: "B212", amount: 200, status: "A" },
{ cust_id: "A123", amount: 300, status: "D" }
]
🔍 $match 단계 적용 후
[
{ cust_id: "A123", amount: 500, status: "A" },
{ cust_id: "A123", amount: 250, status: "A" },
{ cust_id: "B212", amount: 200, status: "A" }
]
✔️ status: "D"인 문서는 제거됨
🧮 $group 단계 결과
[
{ _id: "A123", total: 750 },
{ _id: "B212", total: 200 }
]
✔️ A123: 500 + 250 = 750 ✔️ B212: 200 (단일 문서)
📊 최종 결과 해석
고객 ID (_id) 총 금액 (total)
A123 | 750 |
B212 | 200 |
💡 보너스 정리
목적 해결 방법
특정 조건 데이터만 필터링 | $match 사용 |
그룹별 통계값 구하기 | $group + $sum, $avg, $max 등 활용 |
분석 대상 축소 | $project 또는 $limit 등과 함께 사용 가능 |
✅ 요약
- $match: status가 "A"인 문서만 선택
- $group: cust_id 기준으로 그룹핑하고 amount 합산
- 출력: 고객별 총 주문 금액
🔧 자주 쓰는 Aggregation Stages & 예시
1. $match – 조건 필터링 (SQL의 WHERE)
db.collection.aggregate([
{ $match: { age: { $gte: 30 } } }
])
- 조건에 맞는 문서만 통과시킵니다.
2. $group – 그룹핑 및 집계
db.collection.aggregate([
{ $group: { _id: "$department", avgSalary: { $avg: "$salary" } } }
])
- 부서별 평균 급여를 계산합니다.
- _id는 그룹 기준이 되는 필드입니다.
3. $project – 필드 선택 또는 가공
db.collection.aggregate([
{ $project: { name: 1, age: 1 } }
])
- 특정 필드만 선택하거나, 계산 필드 생성도 가능합니다.
4. $sort – 정렬
db.collection.aggregate([
{ $sort: { age: -1 } }
])
- 내림차순(-1), 오름차순(1) 정렬
5. $limit – 개수 제한
db.collection.aggregate([
{ $limit: 5 }
])
- 결과를 5개로 제한
6. $skip – 문서 건너뛰기
db.collection.aggregate([
{ $skip: 10 }
])
- 앞의 10개 문서를 건너뜁니다 (페이징 처리 시 사용)
7. $unwind – 배열 분해
db.collection.aggregate([
{ $unwind: "$interests" }
])
- 배열을 한 줄씩 펼쳐줍니다. (SQL의 UNNEST 유사)
8. $lookup – 컬렉션 간 조인
db.orders.aggregate([
{
$lookup: {
from: "customers",
localField: "customerId",
foreignField: "_id",
as: "customerDetails"
}
}
])
- 관계형 DB의 JOIN과 동일한 효과를 MongoDB에서 구현
📊 예시: 사용자 평균 나이 계산
db.users.aggregate([
{ $group: { _id: null, averageAge: { $avg: "$age" } } }
])
- 모든 사용자의 평균 나이를 계산합니다.
- _id: null → 전체 문서를 하나의 그룹으로 취급
🧠 Aggregation 활용 팁
팁 설명
복잡한 조건 필터링은 $match로 먼저 수행 | 효율적인 파이프라인 구성 가능 |
$project는 성능에 영향을 줄 수 있음 | 필요한 필드만 남겨두도록 하자 |
$unwind + $group 조합 | 배열 내 항목을 분리 후, 그룹핑/집계 가능 |
✅ 마무리 요약
항목 설명
Aggregation 목적 | 집계/통계/데이터 변형 |
대표 Stage | $match, $group, $project, $sort, $unwind, $lookup |
응용 예시 | 평균 나이, 월별 매출, 조인된 상세 정보 등 |
💡 Aggregation은 MongoDB의 리포트용 데이터 처리의 핵심 무기입니다. 복잡한 쿼리도 pipeline으로 분할하면 쉽게 관리할 수 있어요!
📌 다음 포스트 예고: 실전 Aggregation 문제풀이 + 응용 퀴즈 준비되어 있습니다! 🚀
'Database' 카테고리의 다른 글
Chapter 8-47. Python으로 다루는 MongoDB (PyMongo) (0) | 2025.03.27 |
---|---|
Chapter 8-45. NoSQL MongDB(5/6) MongoDB 비교문법 & 논리연산 (0) | 2025.03.27 |
Chapter 8-44. NoSQL MongDB(4/6) 연습문제 (0) | 2025.03.27 |
Chapter 8-43. NoSQL MongDB(3/6) 쿼리기초 (0) | 2025.03.27 |
Chapter 8-41. NoSQL MongoDB(2/6) MongoDB의 기본 구조 (0) | 2025.03.26 |