MongoDB에서 하위 문서(sub-document)에 포함된 모든 필드의 값을 합산하려면 애그리게이션 프레임워크(Aggregation Framework)를 사용하는 것이 가장 효과적입니다. 이 글에서는 실제 예제를 통해 배열 형태의 하위 문서에 담긴 숫자 필드들을 모두 더하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 연습용으로 사용할 컬렉션을 만들고 문서를 하나 삽입해 보겠습니다. 아래 예제는 여러 플레이어의 점수 정보를 배열 형태로 저장하고 있습니다.
> db.sumEveryFieldDemo.insertOne(
... {
... "_id":101,
... "PlayerDetails": [
... {"PlayerName":"John","PlayerScore":1000},
... {"PlayerName":"Carol","PlayerScore":2000},
... {"PlayerName":"Sam","PlayerScore":3000}
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.sumEveryFieldDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : 101,
"PlayerDetails" : [
{
"PlayerName" : "John",
"PlayerScore" : 1000
},
{
"PlayerName" : "Carol",
"PlayerScore" : 2000
},
{
"PlayerName" : "Sam",
"PlayerScore" : 3000
}
]
}3. 애그리게이션으로 모든 필드 합산하기
이제 핵심 단계입니다. 하위 문서의 특정 필드를 모두 합산하려면 $unwind와 $group, 그리고 $sum 연산자를 조합하여 사용합니다.
- $unwind: PlayerDetails 배열의 각 요소를 개별 문서로 분리합니다.
- $group: _id를 기준으로 문서를 묶습니다.
- $sum: 분리된 각 문서의 PlayerScore 값을 모두 더합니다.
> db.sumEveryFieldDemo.aggregate( [
... { $unwind: "$PlayerDetails" },
... { $group: {
... _id: '$_id',
... sum: { $sum: '$PlayerDetails.PlayerScore' }
... } }
... ] ).pretty();4. 실행 결과 확인
위 애그리게이션 파이프라인을 실행하면 다음과 같이 플레이어 점수가 모두 합산된 결과를 얻을 수 있습니다.
{ "_id" : 101, "sum" : 6000 }결과를 보면 John(1000), Carol(2000), Sam(3000)의 점수가 모두 더해져 총합 6000이 반환된 것을 확인할 수 있습니다.
정리
MongoDB에서 하위 문서나 배열 내부의 숫자 필드를 합산할 때는 $unwind로 배열을 펼친 뒤, $group과 $sum을 활용하는 것이 표준적인 방법입니다. 이 패턴은 점수 집계, 주문 금액 합계 등 다양한 실무 시나리오에서 유용하게 활용됩니다.