MongoDB에서 문서 내부의 배열 데이터를 그룹화하고 각 값이 몇 번 반복되는지 집계하려면 애그리게이션 파이프라인의 $unwind와 $group 연산자를 함께 사용하면 됩니다. 이 글에서는 details 배열에 포함된 Age 값을 기준으로 그룹화하여, 동일한 나이가 몇 번 등장하는지 개수를 구하는 방법을 단계별로 살펴봅니다.
1. 샘플 컬렉션 생성
먼저 insertOne() 메서드를 사용하여 여러 개의 하위 문서를 담은 배열 필드가 포함된 문서를 삽입합니다.
>db.demo559.insertOne({details:[{Name:"Chris",Age:21},{Name:"Bob",Age:22},{Name:"Carol",Age:21},{Name:"Sam",Age:21}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8f38d954b4472ed3e8e866")
}2. 저장된 문서 확인하기
find() 메서드와 pretty() 메서드를 함께 사용하면 컬렉션에 저장된 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.demo559.find().pretty();
위 명령은 다음과 같은 결과를 반환합니다.
{
"_id" : ObjectId("5e8f38d954b4472ed3e8e866"),
"details" : [
{
"Name" : "Chris",
"Age" : 21
},
{
"Name" : "Bob",
"Age" : 22
},
{
"Name" : "Carol",
"Age" : 21
},
{
"Name" : "Sam",
"Age" : 21
}
]
}3. $unwind와 $group으로 나이별 개수 집계하기
배열의 각 요소를 개별 문서로 분리한 뒤 Age 값을 기준으로 그룹화하려면 다음과 같은 애그리게이션 쿼리를 실행합니다.
> db.demo559.aggregate([
... {
... "$unwind": "$details"
... },
... {
... "$group": {
... "_id": "$details.Age",
... "Count": { "$sum" : 1 }
... }
... },
... { "$sort": { "_id" : 1 } }
... ])
쿼리 실행 결과는 다음과 같습니다.
{ "_id" : 21, "Count" : 3 }
{ "_id" : 22, "Count" : 1 }쿼리 단계별 설명
$unwind: details 배열의 각 요소를 별도의 문서로 펼쳐내어, 하나의 문서당 한 명의 정보만 가지도록 만듭니다.
$group: _id를 $details.Age로 지정하여 나이별로 그룹화하고, $sum: 1을 사용해 각 그룹에 속한 문서 수를 계산합니다.
$sort: _id(나이)를 오름차순으로 정렬하여 결과를 한눈에 파악하기 쉽게 만듭니다.
결과를 해석해 보면 나이 21세가 3명(Chris, Carol, Sam), 22세가 1명(Bob)으로 집계되었습니다. 이처럼 $unwind → $group → $sort 순서의 파이프라인을 활용하면 배열 필드 안의 값 분포를 손쉽게 통계 낼 수 있으며, 이름·직책 등 다른 필드에도 동일한 패턴으로 응용할 수 있습니다.