SQL의 SELECT COUNT ... GROUP BY와 같은 집계 결과가 필요하다면, MongoDB에서는 애그리게이션 프레임워크(aggregate)를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 그룹별로 문서 수를 세는 방법을 단계별로 살펴보겠습니다.
먼저 개념을 이해하기 위해 컬렉션을 생성하고 문서를 삽입해 보겠습니다. 아래는 컬렉션에 문서를 추가하는 쿼리입니다 −
> db.countGroupByDemo.insertOne({"StudentId":10,"StudentName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7700871e9c5dd6f1f78296")
}
> db.countGroupByDemo.insertOne({"StudentId":10,"StudentName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77008f1e9c5dd6f1f78297")
}
> db.countGroupByDemo.insertOne({"StudentId":20,"StudentName":"Sam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7700971e9c5dd6f1f78298")
}
> db.countGroupByDemo.insertOne({"StudentId":30,"StudentName":"Mike"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7700a21e9c5dd6f1f78299")
}
> db.countGroupByDemo.insertOne({"StudentId":30,"StudentName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7700aa1e9c5dd6f1f7829a")
}
> db.countGroupByDemo.insertOne({"StudentId":10,"StudentName":"Maxwell"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7700b41e9c5dd6f1f7829b")
}
> db.countGroupByDemo.insertOne({"StudentId":20,"StudentName":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7700bd1e9c5dd6f1f7829c")
}이제 find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 조회해 보겠습니다. 쿼리는 다음과 같습니다 −
> db.countGroupByDemo.find().pretty();
출력 결과
{
"_id" : ObjectId("5c7700871e9c5dd6f1f78296"),
"StudentId" : 10,
"StudentName" : "John"
}
{
"_id" : ObjectId("5c77008f1e9c5dd6f1f78297"),
"StudentId" : 10,
"StudentName" : "Carol"
}
{
"_id" : ObjectId("5c7700971e9c5dd6f1f78298"),
"StudentId" : 20,
"StudentName" : "Sam"
}
{
"_id" : ObjectId("5c7700a21e9c5dd6f1f78299"),
"StudentId" : 30,
"StudentName" : "Mike"
}
{
"_id" : ObjectId("5c7700aa1e9c5dd6f1f7829a"),
"StudentId" : 30,
"StudentName" : "David"
}
{
"_id" : ObjectId("5c7700b41e9c5dd6f1f7829b"),
"StudentId" : 10,
"StudentName" : "Maxwell"
}
{
"_id" : ObjectId("5c7700bd1e9c5dd6f1f7829c"),
"StudentId" : 20,
"StudentName" : "Bob"
}COUNT GROUP BY 쿼리 작성하기
위 데이터에서 확인할 수 있듯이 StudentId 10은 3개, 20은 2개, 30은 2개의 문서를 가지고 있습니다. 이제 $group 스테이지와 $sum 연산자를 조합하여 학생 ID별로 문서 수를 집계해 보겠습니다. 쿼리는 다음과 같습니다 −
> db.countGroupByDemo.aggregate([
... {"$group":{_id:"$StudentId",counter:{$sum:1}}}]);여기서 _id:"$StudentId"는 StudentId 필드 값을 기준으로 문서들을 그룹화하고, counter:{$sum:1}은 각 그룹에 속한 문서마다 1씩 더해 전체 개수를 계산합니다. 이는 SQL의 GROUP BY 절과 COUNT(*) 함수를 함께 사용한 것과 동일한 동작입니다.
출력 결과
{ "_id" : 30, "counter" : 2 }
{ "_id" : 20, "counter" : 2 }
{ "_id" : 10, "counter" : 3 }실행 결과를 보면 StudentId가 30인 그룹은 2건, 20인 그룹은 2건, 10인 그룹은 3건으로 정확하게 집계된 것을 확인할 수 있습니다. 이처럼 MongoDB의 애그리게이션 파이프라인을 사용하면 관계형 데이터베이스의 GROUP BY 집계 기능을 손쉽게 대체할 수 있습니다.