MongoDB 배열 값 기반 집계로 값 합산하기
MongoDB에서 배열 필드의 값을 기준으로 그룹화하고, 해당 값에 맞는 다른 문서들의 수치를 합산하려면 aggregate() 메서드를 사용하면 됩니다. 이 과정은 크게 세 단계로 진행됩니다.
- 배열을 개별 문서로 펼치는 $unwind
- 기준 필드로 묶는 $group
- 합계를 계산하는 $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으로 집계 쿼리 작성하기
이제 배열 값을 기준으로 집계하는 핵심 쿼리를 살펴보겠습니다. $unwind로 OtherDetails 배열을 개별 요소로 분리한 뒤, $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: 그룹 내 문서들의 특정 숫자 필드 값을 모두 더해 합계를 계산합니다.
이 세 가지 파이프라인 단계를 조합하면 서로 다른 문서에 흩어져 있는 배열 데이터도 손쉽게 그룹별 합산 처리할 수 있습니다.