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

MongoDB 집계로 문서 전체에서 배열 내 객체의 개별 속성 합산하기

MongoDB 집계로 배열 내 객체 속성 합산하기

배열 필드 안에 중첩된 객체들의 특정 속성 값을 여러 문서에 걸쳐 합산하려면 MongoDB의 aggregate() 메서드를 사용해야 합니다. 이 글에서는 플레이어 점수 데이터를 예로 들어, 배열 안 객체의 개별 속성을 그룹별로 합산하는 방법을 단계별로 살펴보겠습니다.

1단계: 샘플 컬렉션 생성

먼저 문서가 담긴 컬렉션을 생성합니다.

> db.demo131.insertOne(
...    {
...        "_id": 101,
...        "Details": [
...            {
...                "PlayerScore": 500,
...                "PlayerName": "Chris"
...            },
...            {
...                "PlayerScore": 400,
...                "PlayerName": "David"
...            }
...        ]
...    }
... );
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo131.insertOne(
...    {
...        "_id": 102,
...        "Details": [
...            {
...                "PlayerScore": 600,
...                "PlayerName": "Chris"
...            },
...            {
...                "PlayerScore": 200,
...                "PlayerName": "David"
...            }
...        ]
...    }
... );
{ "acknowledged" : true, "insertedId" : 102 }

2단계: 저장된 문서 확인

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

> db.demo131.find();

이 명령은 다음과 같은 결과를 출력합니다.

{ "_id" : 101, "Details" : [ { "PlayerScore" : 500, "PlayerName" : "Chris" }, { "PlayerScore" : 400, "PlayerName" : "David" } ] }
{ "_id" : 102, "Details" : [ { "PlayerScore" : 600, "PlayerName" : "Chris" }, { "PlayerScore" : 200, "PlayerName" : "David" } ] }

3단계: 배열 내 객체 속성 합산 쿼리 실행

다음은 배열에 있는 객체의 개별 속성(PlayerScore)을 플레이어 이름별로 합산하는 집계 쿼리입니다.

> db.demo131.aggregate([
...    { $unwind: "$Details" },
...    {
...       $group: {
...          _id:"$Details.PlayerName",
...          Value:{$sum:"$Details.PlayerScore"}
...       }
...    },
... {
...    $group: {
...       _id: 0,
...       Details:{ $push: {Details:"$_id",Value:"$Value"}}
...       }
...    },
... {
...    $project:{Details:1,_id:0}
... } ])

위 쿼리는 다음과 같은 결과를 출력합니다.

{ "Details" : [ { "Details" : "David", "Value" : 600 }, { "Details" : "Chris", "Value" : 1100 } ] }

집계 쿼리의 동작 원리

이 쿼리는 크게 세 단계로 구성됩니다. 먼저 $unwind가 Details 배열의 각 요소를 개별 문서로 분해합니다. 그다음 첫 번째 $group 단계에서 PlayerName을 기준으로 그룹화하고 $sum 연산자로 PlayerScore를 합산합니다. 마지막으로 두 번째 $group 단계에서 결과를 하나의 배열로 묶고, $project 단계에서 _id 필드를 제거해 깔끔한 최종 결과를 만들어냅니다.

결과를 살펴보면 David의 점수는 400 + 200 = 600으로, Chris의 점수는 500 + 600 = 1100으로 각각 정확하게 합산된 것을 확인할 수 있습니다. 이 패턴은 주문 금액 집계, 로그 분석 등 배열 형태로 저장된 수치 데이터를 문서 전체에서 요약해야 하는 다양한 상황에 활용할 수 있습니다.