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

MongoDB에서 배열 값을 기반으로 집계하여 다른 문서의 값 합산하기

MongoDB 배열 값 기반 집계로 값 합산하기

MongoDB에서 배열 필드의 값을 기준으로 그룹화하고, 해당 값에 맞는 다른 문서들의 수치를 합산하려면 aggregate() 메서드를 사용하면 됩니다. 이 과정은 크게 세 단계로 진행됩니다.

  1. 배열을 개별 문서로 펼치는 $unwind
  2. 기준 필드로 묶는 $group
  3. 합계를 계산하는 $sum 연산자

실제 예제를 통해 하나씩 살펴보겠습니다.

1단계: 컬렉션 생성 및 문서 삽입

먼저 학생 정보를 담은 컬렉션을 생성하고 문서를 삽입합니다. 각 문서는 StudentDetails 객체 안에 번호와 여러 명의 이름·점수가 담긴 OtherDetails 배열을 포함합니다.

> db.demo126.insertOne(
...     {
...        "StudentDetails" : {
...           "Number" : 1,
...           "OtherDetails" : [
...              {
...                 "Name" : "Chris",
...                 "Score" : 55
...              }
...           ]
...        }
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e304b3068e7f832db1a7f56")
}
> db.demo126.insertOne(
...     {
...        "StudentDetails" : {
...           "Number" : 2,
...           "OtherDetails" : [
...              {
...                 "Name" : "Chris",
...                 "Score" : 35
...              },
...              {
...                 "Name" : "David",
...                 "Score" : 87
...              }
...           ]
...        }
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e304b3068e7f832db1a7f57")
}

위 예제에서 첫 번째 문서에는 Chris의 점수 55점이, 두 번째 문서에는 Chris의 점수 35점과 David의 점수 87점이 저장되어 있습니다.

2단계: find()로 전체 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 조회할 수 있습니다.

> db.demo126.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e304b3068e7f832db1a7f56"), "StudentDetails" : { "Number" : 1, "OtherDetails" : [ { "Name" : "Chris", "Score" : 55 } ] } }
{ "_id" : ObjectId("5e304b3068e7f832db1a7f57"), "StudentDetails" : { "Number" : 2, "OtherDetails" : [ { "Name" : "Chris", "Score" : 35 }, { "Name" : "David", "Score" : 87 } ] } }

3단계: $unwind와 $group으로 집계 쿼리 작성하기

이제 배열 값을 기준으로 집계하는 핵심 쿼리를 살펴보겠습니다. $unwindOtherDetails 배열을 개별 요소로 분리한 뒤, $group으로 이름별로 묶고 $sum으로 점수를 합산합니다.

> db.demo126.aggregate([
...    {
...       $unwind:"$StudentDetails.OtherDetails"
...    },
...    {
...       $group:{
...          _id:"$StudentDetails.OtherDetails.Name",
...          quantity:{
...             $sum:"$StudentDetails.OtherDetails.Score"
...          }
...       }
...    }
... ])

집계 결과 확인

쿼리 실행 결과는 다음과 같습니다.

{ "_id" : "David", "quantity" : 87 }
{ "_id" : "Chris", "quantity" : 90 }

결과를 보면 David는 한 곳에서만 등장했기 때문에 87점이 그대로 출력되었고, Chris는 두 문서에 걸쳐 55점과 35점이 기록되어 있어 두 점수가 합산된 90점이 반환된 것을 확인할 수 있습니다.

핵심 정리

  • $unwind: 배열 필드를 개별 문서로 분해하여 각 요소마다 하나의 문서를 생성합니다.
  • $group: 지정한 필드(여기서는 이름)를 기준으로 문서들을 그룹화합니다.
  • $sum: 그룹 내 문서들의 특정 숫자 필드 값을 모두 더해 합계를 계산합니다.

이 세 가지 파이프라인 단계를 조합하면 서로 다른 문서에 흩어져 있는 배열 데이터도 손쉽게 그룹별 합산 처리할 수 있습니다.