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 정의를 덮어쓰게 되므로, 의도하지 않은 동작을 피하려면 필드 이름을 서로 다르게 지정하는 것이 좋습니다.