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

MongoDB에서 $sum 연산자로 합계를 집계해 총 개수와 총합 구하는 방법

MongoDB에서 합계를 집계하여 총 개수(total count) 또는 총합(total sum)을 구하려면 애그리게이션 파이프라인의 $sum 연산자를 사용하면 됩니다. $sum은 그룹화된 문서들의 값을 더하는 데 사용되며, $sum: 1처럼 상수를 지정하면 문서의 개수를 세는 용도로도 활용할 수 있습니다.

개념을 이해하기 위해 먼저 컬렉션을 생성하고 문서를 삽입해 보겠습니다.

1. 샘플 컬렉션 생성

> db.aggregateSumDemo.insertOne({"CustomerName":"Larry","Amount":140});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8baa0680f10143d8431e18") }
> db.aggregateSumDemo.insertOne({"CustomerName":"Mike","Amount":160});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8baa1380f10143d8431e19") }
> db.aggregateSumDemo.insertOne({"CustomerName":"Sam","Amount":300});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8baa1c80f10143d8431e1a") }
> db.aggregateSumDemo.insertOne({"CustomerName":"David","Amount":500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8baa2580f10143d8431e1b") }

위 명령으로 고객 이름과 금액(Amount)을 포함한 문서 4건이 컬렉션에 저장되었습니다.

2. 저장된 문서 확인

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

> db.aggregateSumDemo.find().pretty();

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

{
    "_id" : ObjectId("5c8baa0680f10143d8431e18"),
    "CustomerName" : "Larry",
    "Amount" : 140
}
{
    "_id" : ObjectId("5c8baa1380f10143d8431e19"),
    "CustomerName" : "Mike",
    "Amount" : 160
}
{
    "_id" : ObjectId("5c8baa1c80f10143d8431e1a"),
    "CustomerName" : "Sam",
    "Amount" : 300
}
{
    "_id" : ObjectId("5c8baa2580f10143d8431e1b"),
    "CustomerName" : "David",
    "Amount" : 500
}

3. 총 개수(Total Count) 구하기

문서의 총 개수를 구하려면 $group 단계에서 _id: null로 전체 문서를 하나의 그룹으로 묶고, $sum: 1을 사용하면 됩니다. 문서 하나당 1씩 더해지므로 결과적으로 전체 문서 수가 계산됩니다.

Case 1 — 쿼리는 다음과 같습니다.

> db.aggregateSumDemo.aggregate([ {
    ... $group: {
       ... _id: null,
       ... "TotalCount": {
          ... $sum:1
       ... }
    ... }
... } ] );

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

{ "_id" : null, "TotalCount" : 4 }

컬렉션에 저장된 문서는 총 4건이므로 TotalCount가 4로 반환됩니다.

4. 필드 값의 총합(Total Sum) 구하기

특정 필드 값들의 합계를 구하려면 $sum에 필드명을 문자열로 전달하면 됩니다. 여기서는 Amount 필드의 총합을 계산합니다.

Case 2 — 쿼리는 다음과 같습니다.

> db.aggregateSumDemo.aggregate([ {
    ... $group: {
       ... _id: null,
       ... "TotalAmount": {
          ... $sum: "$Amount"
       ... }
    ... }
... } ] );

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

{ "_id" : null, "TotalAmount" : 1100 }

140 + 160 + 300 + 500 = 1100이므로 모든 고객의 금액 합계가 정상적으로 계산되었습니다.

정리

MongoDB에서 $sum 연산자를 활용하는 방식을 정리하면 다음과 같습니다.

  • 총 개수 구하기: $group에서 _id: null로 전체를 묶은 뒤 $sum: 1 사용
  • 필드 값 총합 구하기: $sum: "$필드명" 형태로 해당 필드의 값을 모두 더함

참고로 특정 조건에 맞는 문서만 집계하고 싶다면 $match 단계를 $group 이전에 추가하면 되며, 카테고리별 합계가 필요하다면 _id: null 대신 그룹화할 필드를 지정하면 됩니다.