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

MongoDB에서 하위 문서 필드 합계 구하는 방법

MongoDB 하위 문서 필드의 합계 구하기

MongoDB에서 중첩된 하위 문서(sub-document) 내부의 숫자 필드 값을 모두 더하려면 애그리게이션 프레임워크(Aggregation Framework)를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 하위 문서 필드의 합계를 구하는 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 고객 구매 정보가 중첩된 문서 형태로 저장된 컬렉션을 만들어 보겠습니다. insertOne() 메서드를 사용해 세 개의 문서를 삽입합니다.

> db.summingSubDocumentDemo.insertOne(
... { "_id" :101, "CustomerDetails" : { "CustomerPurchase" : { "CustomerPurchaseAmount" : 2000 } } });
{ "acknowledged" : true, "insertedId" : 101 }

> db.summingSubDocumentDemo.insertOne( { "_id" :102, "CustomerDetails" : { "CustomerPurchase" : { "CustomerPurchaseAmount" : 3000 } } });
{ "acknowledged" : true, "insertedId" : 102 }

> db.summingSubDocumentDemo.insertOne( { "_id" :103, "CustomerDetails" : { "CustomerPurchase" : { "CustomerPurchaseAmount" : 5000 } } });
{ "acknowledged" : true, "insertedId" : 103 }

여기서 주목할 점은 CustomerPurchaseAmount 필드가 CustomerDetailsCustomerPurchase로 이어지는 두 겹의 하위 문서 안에 위치해 있다는 것입니다.

2. 저장된 문서 확인하기

find() 메서드와 pretty()를 함께 사용하면 컬렉션에 저장된 모든 문서를 보기 좋게 출력할 수 있습니다.

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

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : 101,
    "CustomerDetails" : {
        "CustomerPurchase" : {
            "CustomerPurchaseAmount" : 2000
        }
    }
}
{
    "_id" : 102,
    "CustomerDetails" : {
        "CustomerPurchase" : {
            "CustomerPurchaseAmount" : 3000
        }
    }
}
{
    "_id" : 103,
    "CustomerDetails" : {
        "CustomerPurchase" : {
            "CustomerPurchaseAmount" : 5000
        }
    }
}

3. 애그리게이션으로 하위 문서 필드 합산하기

이제 핵심 단계입니다. aggregate() 메서드에 $group 스테이지와 $sum 연산자를 조합하면, 점 표기법(dot notation)으로 경로를 지정하여 깊숙이 중첩된 하위 문서의 필드 값까지 손쉽게 합산할 수 있습니다.

> db.summingSubDocumentDemo.aggregate({$group : {_id: "",
... totalAmount : {$sum: "$CustomerDetails.CustomerPurchase.CustomerPurchaseAmount"}}},
... {$project: {_id: 0, totalAmount: 1}});

쿼리의 동작 방식을 간단히 설명하면 다음과 같습니다.

  • $group: 모든 문서를 하나의 그룹으로 묶습니다. _id: ""로 지정하면 전체 문서가 동일한 그룹에 속하게 됩니다.
  • $sum: 지정한 경로($CustomerDetails.CustomerPurchase.CustomerPurchaseAmount)의 값들을 모두 더합니다.
  • $project: 출력 결과에서 불필요한 _id 필드를 제외하고 합계 값만 표시합니다.

4. 실행 결과 확인

위 애그리게이션 쿼리를 실행하면 다음과 같이 세 문서의 구매 금액(2000 + 3000 + 5000)이 합산된 결과를 얻을 수 있습니다.

{ "totalAmount" : 10000 }

마무리

이처럼 MongoDB의 애그리게이션 프레임워크를 사용하면 아무리 깊이 중첩된 하위 문서의 필드라도 점 표기법으로 경로를 정확히 지정하기만 하면 간단하게 합계를 계산할 수 있습니다. $group, $sum, $project의 조합은 실무에서 통계 집계 작업에 매우 자주 활용되는 패턴이므로 꼭 익혀두시길 권장합니다.