MongoDB

MongoDB Aggregate 파이프라인

코샵 2025. 2. 25. 10:12
반응형

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"
                    }
                }
            }
        }
    }
])

 

주요 포인트

  1. 파이프라인 최적화
    • $match를 가능한 일찍 사용
    • 불필요한 필드는 일찍 제거
    • 인덱스 활용
  2. 메모리 사용량 관리
    • 대용량 데이터 처리 시 $limit 사용
    • allowDiskUse 옵션 고려
    • 적절한 배치 크기 설정
  3. 성능 고려사항
    • 인덱스 활용 확인
    • 캐싱 전략 수립
    • 실행 계획 분석
  4. 데이터 정확성
    • null 값 처리
    • 타입 변환 주의
    • 날짜 처리 시 시간대 고려

MongoDB의 aggregate 파이프라인을 효과적으로 사용하면 복잡한 데이터 분석과 처리를 효율적으로 수행할 수 있습니다.