MongoDB에서 배열 문서를 집계하는 방법
MongoDB에서 배열(Array) 형태로 저장된 문서의 값을 집계하려면 애그리게이션 프레임워크(aggregate framework)를 사용해야 합니다. 이 글에서는 배열 안에 중첩된 여러 문서의 특정 필드 값에 대해 최솟값과 최댓값을 계산하는 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 배열 형태의 문서를 포함하는 컬렉션을 생성합니다. 아래 예시에서는 사용자 정보(UserDetails)가 배열로 저장되어 있으며, 각 요소는 사용자 이름과 로그인 연도를 담고 있습니다.
> db.aggregateArrayDemo.insertOne(
{
"_id":100,
"UserDetails": [
{
"UserName": "John",
"UserLoginYear":2010
},
{
"UserName": "Carol",
"UserLoginYear":2019
}
]
}
);
{ "acknowledged" : true, "insertedId" : 100 }2단계: find() 메서드로 전체 문서 확인
컬렉션이 정상적으로 생성되었는지 확인하기 위해 find() 메서드로 모든 문서를 조회해 보겠습니다.
> db.aggregateArrayDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : 100,
"UserDetails" : [
{
"UserName" : "John",
"UserLoginYear" : 2010
},
{
"UserName" : "Carol",
"UserLoginYear" : 2019
}
]
}3단계: 애그리게이션으로 배열 문서 집계하기
이제 핵심 단계입니다. aggregate() 메서드를 사용하여 배열 내 문서들을 집계합니다. 여기서는 두 개의 파이프라인 단계를 활용합니다.
- $match: _id가 100인 문서만 필터링합니다.
- $project: 출력할 필드를 지정하며, $min과 $max 연산자로 UserLoginYear 필드의 최솟값과 최댓값을 각각 계산합니다.
> db.aggregateArrayDemo.aggregate([
{
$match: { _id: 100 }
},
{
$project: {
Minimum: { $min: "$UserDetails.UserLoginYear" },
Maximum: { $max: "$UserDetails.UserLoginYear" }
}
}
]);위 애그리게이션 쿼리를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
{ "_id" : 100, "Minimum" : 2010, "Maximum" : 2019 }결과 해석
실행 결과를 보면 배열 내 두 사용자(John: 2010년, Carol: 2019년)의 로그인 연도 중 최솟값은 2010, 최댓값은 2019로 정상적으로 집계된 것을 확인할 수 있습니다. 이처럼 $match로 대상 문서를 좁히고, $project에서 $min, $max 같은 집계 연산자를 조합하면 배열로 중첩된 문서 데이터도 손쉽게 분석할 수 있습니다.