반응형
MongoDB의 aggregate 파이프라인은 데이터를 처리하고 분석하는 강력한 도구입니다. 데이터를 단계별로 처리하여 원하는 결과를 얻을 수 있습니다.
기본 구조
db.collection.aggregate([
{ $match: { /* 조건 */ } },
{ $group: { /* 그룹화 */ } },
{ $sort: { /* 정렬 */ } }
])
$match: 데이터 필터링
// 가격이 1000 이상인 상품 필터링
db.products.aggregate([
{
$match: {
price: { $gte: 1000 },
category: "electronics"
}
}
])
$group: 데이터 그룹화
// 카테고리별 평균 가격 계산
db.products.aggregate([
{
$group: {
_id: "$category",
avgPrice: { $avg: "$price" },
totalProducts: { $sum: 1 },
maxPrice: { $max: "$price" }
}
}
])
$project: 필드 선택 및 변형
// 필요한 필드만 선택하고 변형
db.orders.aggregate([
{
$project: {
_id: 0,
orderDate: 1,
totalAmount: "$amount",
customerName: {
$concat: ["$firstName", " ", "$lastName"]
}
}
}
])
$unwind: 배열 펼치기
// 주문의 상품 배열을 개별 문서로 변환
db.orders.aggregate([
{
$unwind: "$items"
},
{
$project: {
productId: "$items.productId",
quantity: "$items.quantity",
orderDate: 1
}
}
])
$lookup: 컬렉션 조인
// 주문과 사용자 정보 조인
db.orders.aggregate([
{
$lookup: {
from: "users",
localField: "userId",
foreignField: "_id",
as: "userDetails"
}
},
{
$unwind: "$userDetails"
}
])
복잡한 집계 예시
// 월별, 카테고리별 판매 분석
db.sales.aggregate([
// 날짜 조건 필터링
{
$match: {
date: {
$gte: ISODate("2024-01-01"),
$lt: ISODate("2025-01-01")
}
}
},
// 월별로 그룹화
{
$group: {
_id: {
month: { $month: "$date" },
category: "$category"
},
totalSales: { $sum: "$amount" },
count: { $sum: 1 }
}
},
// 결과 정렬
{
$sort: {
"_id.month": 1,
"totalSales": -1
}
}
])
고급 집계 기능
// 누적 합계 계산
db.transactions.aggregate([
{
$sort: { date: 1 }
},
{
$group: {
_id: "$userId",
transactions: {
$push: {
amount: "$amount",
date: "$date"
}
},
runningTotal: {
$sum: "$amount"
}
}
}
])
// 윈도우 함수 사용
db.sales.aggregate([
{
$setWindowFields: {
partitionBy: "$region",
sortBy: { date: 1 },
output: {
movingAvg: {
$avg: "$amount",
window: {
range: [-2, 0],
unit: "month"
}
}
}
}
}
])
주요 포인트
- 파이프라인 최적화
- $match를 가능한 일찍 사용
- 불필요한 필드는 일찍 제거
- 인덱스 활용
- 메모리 사용량 관리
- 대용량 데이터 처리 시 $limit 사용
- allowDiskUse 옵션 고려
- 적절한 배치 크기 설정
- 성능 고려사항
- 인덱스 활용 확인
- 캐싱 전략 수립
- 실행 계획 분석
- 데이터 정확성
- null 값 처리
- 타입 변환 주의
- 날짜 처리 시 시간대 고려
MongoDB의 aggregate 파이프라인을 효과적으로 사용하면 복잡한 데이터 분석과 처리를 효율적으로 수행할 수 있습니다.
'MongoDB' 카테고리의 다른 글
MongoDB 프로젝션(Projection) (0) | 2025.02.15 |
---|---|
Windows에서 Linux로 MongoDB 마이그레이션 하기 (0) | 2025.01.19 |
MongoDB 쿼리 작성법과 최적화 (2) | 2024.12.03 |