MongoDB에서 특정 필드의 값을 합산하려면 aggregate 파이프라인과 함께 $sum 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 컬렉션을 생성하고, 조건에 맞는 문서만 필터링한 뒤 필드 값을 그룹별로 합산하는 전체 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 테스트용 문서들을 삽입합니다.
> db.getSumOfFieldsDemo.insertOne({"Customer_Id":101,"Price":50,"Status":"Active"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06cec29e4dae213890ac55")
}
> db.getSumOfFieldsDemo.insertOne({"Customer_Id":102,"Price":200,"Status":"Inactive"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06ced19e4dae213890ac56")
}
> db.getSumOfFieldsDemo.insertOne({"Customer_Id":101,"Price":3000,"Status":"Active"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06cedd9e4dae213890ac57")
}
> db.getSumOfFieldsDemo.insertOne({"Customer_Id":103,"Price":400,"Status":"Active"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06cee79e4dae213890ac58")
}2. 저장된 문서 확인하기
find() 메서드와 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.getSumOfFieldsDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e06cec29e4dae213890ac55"),
"Customer_Id" : 101,
"Price" : 50,
"Status" : "Active"
}
{
"_id" : ObjectId("5e06ced19e4dae213890ac56"),
"Customer_Id" : 102,
"Price" : 200,
"Status" : "Inactive"
}
{
"_id" : ObjectId("5e06cedd9e4dae213890ac57"),
"Customer_Id" : 101,
"Price" : 3000,
"Status" : "Active"
}
{
"_id" : ObjectId("5e06cee79e4dae213890ac58"),
"Customer_Id" : 103,
"Price" : 400,
"Status" : "Active"
}3. $match와 $group으로 특정 필드 합산하기
이제 상태(Status)가 "Active"인 문서만 대상으로 고객 ID별 Price 합계를 구해보겠습니다. 여기서 두 개의 집계 단계를 사용합니다.
- $match: 조건에 맞는 문서만 필터링합니다.
- $group: 지정한 기준(여기서는 Customer_Id)으로 문서를 묶고, $sum으로 Price 값을 더합니다.
> db.getSumOfFieldsDemo.aggregate([ { $match: { Status: "Active" } }, { $group: { _id: "$Customer_Id", TotalSum: { $sum: "$Price" } } } ]);실행 결과는 다음과 같습니다.
{ "_id" : 103, "TotalSum" : 400 }
{ "_id" : 101, "TotalSum" : 3050 }결과 해석
출력 결과를 보면 상태가 Active인 문서만 집계 대상에 포함되었음을 알 수 있습니다.
- 고객 101: 50 + 3000 = 3050
- 고객 103: 400
상태가 Inactive인 고객 102의 데이터는 $match 단계에서 제외되었기 때문에 결과에 나타나지 않습니다.
마무리
MongoDB에서 조건부 합계를 구할 때는 $match로 먼저 문서를 걸러내고, $group과 $sum으로 원하는 필드를 집계하는 패턴이 가장 일반적입니다. 이 방식은 매출 집계, 주문 금액 합산 등 실무에서 자주 활용되므로 꼭 익혀두시기 바랍니다.