Header Banner
GG Logo

Future Engineering

기술의 최전선을 기록합니다.

기술 자료/BackEnd/[MongoDB] 데이터 처리 및 분석을 위한 aggregate와 pipeline

[MongoDB] 데이터 처리 및 분석을 위한 aggregate와 pipeline

BackEnd10개월 전

MongoDB의 aggregate데이터 처리 및 분석을 위해 여러 스테이지를 거쳐 데이터를 변형하거나 집계하는 데 사용되는 강력한 도구입니다. aggregate 메서드는 pipeline 개념을 사용하여, 데이터를 다양한 스테이지로 처리해 원하는 결과를 도출합니다. 각 스테이지는 하나의 데이터 변환 작업을 수행하며, 파이프라인은 이 스테이지들을 순차적으로 처리합니다.

 

주요 aggregate()

$match 필터링

find쿼리처럼 조건에 맞는 문서를 필터링하는 역할을 합니다. 쿼리의 시작 단계에서 주로 사용되며, 조건에 맞는 문서만 다음 스테이지로 전달합니다.

db.users.aggregate([
  {
    $match: { status: "active" }
  }
])

 

$group 데이터 그룹화

데이터를 특정 기준에 따라 그룹으로 묶고, 각 그룹에 대한 집계(합계, 평균 등)을 수행할 때 사용됩니다. 그룹화는 일반적으로 _id 필드를 사용해 그룹화 기준을 설정합니다.

db.users.aggregate([
  {
    $group: {
      _id: "$status", // status 필드를 기준으로 그룹화
      count: { $sum: 1 } // 각 그룹의 문서 개수 계산
    }
  }
])

 

$sort 정렬

집계 결과를 특정 필드를 기준으로 오름차순(1) 또는 내림차순(-1)로 정렬하는 데 사용됩니다. 집계된 결과나 필터링된 데이터를 정렬할 때 사용됩니다.

db.users.aggregate([
  {
    $sort: { age: 1 } // age 필드를 기준으로 오름차순 정렬
  }
])

 

$project 필드 선택

문서에서 반환할 필드를 지정하거나, 새로 계산한 필드를 반환할 때 사용됩니다. 필요한 필드만 선택하여 결과에 포함시키거나, 필드 값들을 변형할 수 있습니다.

db.users.aggregate([
  {
    $project: {
      name: 1, // name 필드를 포함
      age: 1, // age 필드를 포함
      _id: 0 // _id 필드를 제외
    }
  }
])

 

limitskip을 통해 문서 제한 및 건너뛰기

반환할 문서 수를 제한할 수 있는 limit, 처음 몇 개의 문서를 건너뛰고 결과를 반환하는 skip이 존재합니다.

db.users.aggregate([
  { $limit: 5 }
])
// 사용자 반환을 5명으로 제한
db.users.aggregate([
  { $skip: 10 },
  { $limit: 5 }
])
// 처음 10명의 사용자는 건너뛰고, 5명의 사용자를 조회

 

복합 Pipeline 확인하기

  • status가 active

  • 나이로 그룹화하고 사용자가 몇명인지 집계한다.

  • 사용자 수가 많은 순으로 정렬한다.

  • 상위 3개의 그룹만 보여준다.

db.users.aggregate([
  {
    $match: { status: "active" } // status가 active인 사용자만 필터링
  },
  {
    $group: {
      _id: "$age", // 나이별로 그룹화
      count: { $sum: 1 } // 각 나이 그룹의 사용자 수 집계
    }
  },
  {
    $sort: { count: -1 } // 사용자 수(count)가 많은 순으로 정렬
  },
  {
    $limit: 3 // 상위 3개의 나이 그룹만 반환
  }
])

MongoDB의 aggregate를 사용하면 데이터를 분석하고 변형하는 데 편리합니다. $match, $group, $sort, $project와 같은 다양한 스테이지를 조합하여 복잡한 집계 작업을 쉽게 처리할 수 있습니다.