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

MongoDB에서 특정 필드 합산하는 방법 – $sum과 aggregate 완벽 가이드

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으로 원하는 필드를 집계하는 패턴이 가장 일반적입니다. 이 방식은 매출 집계, 주문 금액 합산 등 실무에서 자주 활용되므로 꼭 익혀두시기 바랍니다.