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 } } // 총 구매액 내림차순 정렬
])