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

$group 쿼리 예제로 배우는 MongoDB 집계 프레임워크 완벽 가이드

MongoDB의 집계 프레임워크(Aggregation Framework)에서 문서를 그룹화하려면 $group 단계를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 $group의 기본 개념부터 실행 결과까지 단계별로 살펴보겠습니다.

1. 샘플 데이터 생성하기

먼저 insertOne() 메서드를 사용해 문서를 삽입하고 컬렉션을 생성합니다.

> db.demo639.insertOne(
...     {
...        "_id" : 1,
...        "CountryName" : "US",
...        "Info1" : {
...           "Name" : "Chris",
...           "SubjectName" : "MySQL",
...           "Marks" : 78
...        },
...        "Info2" : {
...           "Name" : "Chris",
...           "SubjectName" : "MySQL",
...           "Marks" : 78
...        }
...    }
... );
{ "acknowledged" : true, "insertedId" : 1 }
> db.demo639.insertOne(
... {
...    "_id" : 2,
...    "CountryName" : "UK",
...    "Info1" : {
...       "Name" : "Chris",
...       "SubjectName" : "MySQL",
...       "Marks" : 79
...    },
...    "Info2" : {
...            "Name" : "Chris",
...            "SubjectName" : "MySQL",
...            "Marks" : 88
...        }
...    }
... );
{ "acknowledged" : true, "insertedId" : 2 }

2. 저장된 문서 확인하기

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

> db.demo639.find();

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

{ "_id" : 1, "CountryName" : "US", "Info1" : { "Name" : "Chris", "SubjectName" : "MySQL", "Marks" : 78 }, "Info2" : { "Name" : "Chris", "SubjectName" : "MySQL", "Marks" : 78 } }
{ "_id" : 2, "CountryName" : "UK", "Info1" : { "Name" : "Chris", "SubjectName" : "MySQL", "Marks" : 79 }, "Info2" : { "Name" : "Chris", "SubjectName" : "MySQL", "Marks" : 88 } }

3. $group을 활용한 집계 쿼리 실행

다음은 Info1.Name과 Info2.Name 필드 값을 기준으로 문서를 그룹화한 뒤, 각 그룹의 Info2.Marks 합계를 계산하는 집계 쿼리입니다.

> db.demo639.aggregate({$group : {_id : {Name1:"$Info1.Name",Name2:"$Info2.Name"},
...
...    Marks:{$first:"$Info2.Marks"},
...    Marks:{$sum:"$Info2.Marks"}
... }}).pretty();

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

{ "_id" : { "Name1" : "Chris", "Name2" : "Chris" }, "Marks" : 166 }

결과 분석

두 문서 모두 Info1.Name과 Info2.Name이 "Chris"로 동일하기 때문에 하나의 그룹으로 묶였습니다. 이후 $sum 연산자가 해당 그룹 내 Info2.Marks 값(78 + 88)을 합산하여 최종 결과인 166을 반환했습니다.

참고로 위 쿼리에서는 Marks 필드가 같은 객체 안에 두 번 정의되어 있습니다. 이 경우 나중에 선언된 $sum 정의가 앞선 $first 정의를 덮어쓰게 되므로, 의도하지 않은 동작을 피하려면 필드 이름을 서로 다르게 지정하는 것이 좋습니다.