Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB $group으로 문서 배열 내 반복되는 Age 값 개수 집계하기

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 순서의 파이프라인을 활용하면 배열 필드 안의 값 분포를 손쉽게 통계 낼 수 있으며, 이름·직책 등 다른 필드에도 동일한 패턴으로 응용할 수 있습니다.