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

MongoDB에서 여러 필드로 그룹화하여 중복 ID의 총 점수 합계 구하기

MongoDB에서 중복된 ID가 포함된 데이터의 총 점수를 계산하려면 aggregate() 메서드와 함께 $group 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 여러 필드(id, Name)를 기준으로 그룹화하고 점수(Marks)의 합계를 구하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용해 테스트용 문서들을 삽입합니다. 아래 예제에서는 id가 101과 102인 문서들이 각각 두 개씩 존재합니다.

> db.demo627.insertOne({id:101,"Name":"Chris","Marks":54});
{ "acknowledged" : true, "insertedId" : ObjectId("5e9acb306c954c74be91e6b2") }
> db.demo627.insertOne({id:102,"Name":"Bob","Marks":74});
{ "acknowledged" : true, "insertedId" : ObjectId("5e9acb3c6c954c74be91e6b3") }
> db.demo627.insertOne({id:101,"Name":"Chris","Marks":87});
{ "acknowledged" : true, "insertedId" : ObjectId("5e9acb426c954c74be91e6b4") }
> db.demo627.insertOne({id:102,"Name":"Mike","Marks":70});
{ "acknowledged" : true, "insertedId" : ObjectId("5e9acb4b6c954c74be91e6b5") }

2. 저장된 문서 확인하기

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

> db.demo627.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e9acb306c954c74be91e6b2"), "id" : 101, "Name" : "Chris", "Marks" : 54 }
{ "_id" : ObjectId("5e9acb3c6c954c74be91e6b3"), "id" : 102, "Name" : "Bob", "Marks" : 74 }
{ "_id" : ObjectId("5e9acb426c954c74be91e6b4"), "id" : 101, "Name" : "Chris", "Marks" : 87 }
{ "_id" : ObjectId("5e9acb4b6c954c74be91e6b5"), "id" : 102, "Name" : "Mike", "Marks" : 70 }

3. 여러 필드로 그룹화하는 집계 쿼리 작성

이제 aggregate() 파이프라인 안에서 $group을 사용해 id와 Name 두 개의 필드를 기준으로 그룹화하고, $sum 연산자로 Marks 값을 모두 더해 보겠습니다. 첫 번째 $group 단계에서 각 그룹별 점수 합계를 구하고, 두 번째 $group 단계에서 최종 총점(TotalMarks)을 계산합니다.

> db.demo627.aggregate([
...    { "$group": {
...       "_id": {
...          "id" : "$id",
...          "Name":"$Name"
...       },
...       "Marks": { "$sum": "$Marks" }
...    }},
...    { "$group": {
...       "_id": {
...          "id" : "$_id.id",
...          "Name": "$_id.Name"
...       },
...
...       "TotalMarks": { "$sum": "$Marks" }
...    }}
... ], { "allowDiskUse": true }
... );

4. 실행 결과 확인

위 집계 쿼리를 실행하면 다음과 같이 중복 ID가 하나로 묶여 총점이 계산된 결과를 확인할 수 있습니다.

{ "_id" : { "id" : 101, "Name" : "Chris" }, "TotalMarks" : 141 }
{ "_id" : { "id" : 102, "Name" : "Bob" }, "TotalMarks" : 74 }
{ "_id" : { "id" : 102, "Name" : "Mike" }, "TotalMarks" : 70 }

쿼리 동작 방식 정리

결과를 살펴보면 id가 101인 Chris의 경우 54점과 87점이 합산되어 총점 141점이 출력되었습니다. 반면 id가 102인 경우에는 이름(Bob, Mike)이 서로 다르기 때문에 별도의 그룹으로 분류되어 각각 74점과 70점으로 계산되었습니다.

즉, $group의 _id에 여러 필드를 객체 형태로 지정하면 해당 필드들의 조합을 기준으로 그룹핑이 수행됩니다. 또한 allowDiskUse 옵션을 true로 설정하면 대량의 데이터를 처리할 때 메모리 한도(100MB)를 초과하더라도 디스크를 임시로 활용해 오류 없이 집계를 완료할 수 있습니다.