본문 바로가기
카테고리 없음

MongoDB aggregate() 사용법

by BillyCho 2025. 2. 21.

 

MongoDB의 aggregate는 여러 단계의 파이프라인을 사용하여 데이터를 처리하고 변환하는 강력한 기능입니다. 이를 통해 복잡한 쿼리, 그룹화, 필터링, 정렬 등을 수행할 수 있습니다.


📌 aggregate 기본 구조

db.collection.aggregate([
  { 단계1 },
  { 단계2 },
  { 단계3 },
  ...
])

각 단계는 데이터를 변환하는 역할을 하며, 다음 단계로 결과를 전달합니다.


📌 주요 aggregate 연산자

1. $match (필터링)

특정 조건을 만족하는 문서만 선택합니다. find()와 비슷한 역할을 합니다.

db.users.aggregate([
  { $match: { age: { $gte: 18 } } } // 18세 이상만 선택
])

2. $group (그룹화)

_id를 기준으로 데이터를 그룹화하고, 그룹별 연산을 수행할 수 있습니다.

db.orders.aggregate([
  {
    $group: {
      _id: "$customerId",
      totalAmount: { $sum: "$price" }  // 고객별 총 구매액 계산
    }
  }
])

3. $sort (정렬)

1이면 오름차순, -1이면 내림차순 정렬을 의미합니다.

db.products.aggregate([
  { $sort: { price: -1 } } // 가격 내림차순 정렬
])

4. $project (필드 선택 및 변환)

필드의 포함/제외, 새로운 필드 추가 등이 가능합니다.

db.users.aggregate([
  {
    $project: {
      name: 1,  // name 필드 포함
      age: 1,   // age 필드 포함
      isAdult: { $gte: ["$age", 18] } // 18세 이상 여부 추가
    }
  }
])

5. $lookup (조인)

두 컬렉션을 조인할 때 사용됩니다.

db.orders.aggregate([
  {
    $lookup: {
      from: "customers",        // 조인할 컬렉션
      localField: "customerId", // 현재 컬렉션의 필드
      foreignField: "_id",      // 상대 컬렉션의 필드
      as: "customerInfo"        // 결과 배열 필드명
    }
  }
])

6. $unwind (배열 펼치기)

배열을 개별 문서로 변환합니다.

db.users.aggregate([
  { $unwind: "$hobbies" } // hobbies 배열을 하나씩 풀어서 문서 생성
])

📌 예제: 복합 쿼리 만들기

"주문 컬렉션"에서 특정 기간 내 주문을 조회하고, 고객 정보를 조인한 후, 총 주문 금액이 높은 순으로 정렬하는 예제입니다.

db.orders.aggregate([
  { $match: { date: { $gte: ISODate("2024-01-01"), $lt: ISODate("2024-12-31") } } }, // 2024년 주문 필터
  { $lookup: { from: "customers", localField: "customerId", foreignField: "_id", as: "customerInfo" } }, // 고객 정보 추가
  { $unwind: "$customerInfo" }, // 배열 형태 해제
  { $group: { _id: "$customerId", totalAmount: { $sum: "$amount" }, name: { $first: "$customerInfo.name" } } }, // 고객별 총 구매액 계산
  { $sort: { totalAmount: -1 } } // 총 구매액 내림차순 정렬
])