여러 필드를 기준으로 데이터를 그룹화하려면 MongoDB의 $group 연산자를 사용하면 됩니다. $group은 집계 파이프라인(aggregate) 내에서 지정한 필드 조합을 고유 키(_id)로 삼아, 동일한 값을 가진 문서들을 하나의 그룹으로 묶어 주는 역할을 합니다.
먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.demo192.insertOne({"Name":"Chris","Age":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3adb9f03d395bdc21346cd")
}
> db.demo192.insertOne({"Name":"David","Age":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3adba103d395bdc21346ce")
}
> db.demo192.insertOne({"Name":"Chris","Age":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3adba503d395bdc21346cf")
}
> db.demo192.insertOne({"Name":"Mike","Age":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3adbbf03d395bdc21346d0")
}find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 확인합니다.
> db.demo192.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e3adb9f03d395bdc21346cd"), "Name" : "Chris", "Age" : 22 }
{ "_id" : ObjectId("5e3adba103d395bdc21346ce"), "Name" : "David", "Age" : 21 }
{ "_id" : ObjectId("5e3adba503d395bdc21346cf"), "Name" : "Chris", "Age" : 22 }
{ "_id" : ObjectId("5e3adbbf03d395bdc21346d0"), "Name" : "Mike", "Age" : 24 }집계 프레임워크로 여러 필드 그룹화하기
이제 집계 프레임워크를 사용해 Age와 Name 두 필드를 기준으로 문서를 그룹화하는 쿼리입니다. 핵심은 _id 값에 객체 형태로 그룹화할 필드들을 지정하는 것입니다.
> db.demo192.aggregate([{$group:{_id:{Age:"$Age",Name:"$Name"}}}]);실행 결과는 다음과 같습니다.
{ "_id" : { "Age" : 24, "Name" : "Mike" } }
{ "_id" : { "Age" : 21, "Name" : "David" } }
{ "_id" : { "Age" : 22, "Name" : "Chris" } }결과를 보면 이름과 나이가 완전히 동일했던 Chris(22세) 문서 두 개가 하나의 그룹으로 병합된 것을 확인할 수 있습니다. 이처럼 _id 안에 여러 필드를 객체로 나열하면 해당 필드 값들의 조합을 기준으로 그룹화가 수행됩니다.
또한 $sum, $count 같은 누적 연산자를 함께 사용하면 각 그룹의 문서 개수나 합계 등 추가 통계도 손쉽게 계산할 수 있습니다.