[MongoDB] 데이터 처리 및 분석을 위한 aggregate와 pipeline
KUKJIN LEE • 2개월 전 작성
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 필드를 제외
}
}
])
limit
과 skip
을 통해 문서 제한 및 건너뛰기
반환할 문서 수를 제한할 수 있는 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
와 같은 다양한 스테이지를 조합하여 복잡한 집계 작업을 쉽게 처리할 수 있습니다.