MongoDB에서 각 사용자별 등장 횟수를 세고 가장 많이 등장한 상위 사용자를 조회하려면 $group 연산자와 aggregate() 메서드를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 데이터 삽입
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입합니다.
> db.demo264.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed441627c0c63e7dba9e")
}
> db.demo264.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed471627c0c63e7dba9f")
}
> db.demo264.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed491627c0c63e7dbaa0")
}
> db.demo264.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed4c1627c0c63e7dbaa1")
}
> db.demo264.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed4e1627c0c63e7dbaa2")
}
> db.demo264.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed531627c0c63e7dbaa3")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo264.find();
실행하면 다음과 같은 출력 결과가 나타납니다.
{ "_id" : ObjectId("5e47ed441627c0c63e7dba9e"), "Name" : "Chris" }
{ "_id" : ObjectId("5e47ed471627c0c63e7dba9f"), "Name" : "David" }
{ "_id" : ObjectId("5e47ed491627c0c63e7dbaa0"), "Name" : "Chris" }
{ "_id" : ObjectId("5e47ed4c1627c0c63e7dbaa1"), "Name" : "Bob" }
{ "_id" : ObjectId("5e47ed4e1627c0c63e7dbaa2"), "Name" : "Chris" }
{ "_id" : ObjectId("5e47ed531627c0c63e7dbaa3"), "Name" : "Bob" }3. 집계 쿼리로 상위 사용자 찾기
MongoDB에서 SQL의 COUNT에 해당하는 기능은 집계 파이프라인의 $sum 연산자로 구현할 수 있습니다. 아래 쿼리는 이름별로 그룹화한 뒤 등장 횟수를 계산하고, 내림차순으로 정렬하여 상위 5명까지 조회합니다.
> db.demo264.aggregate(
... {$group : {_id : "$Name", "count" : {$sum : 1}}},
... {$sort : {"count" : -1}},
... {$limit : 5}
...)각 단계의 역할은 다음과 같습니다.
- $group: Name 필드 값을 기준으로 문서를 그룹화하고, $sum : 1을 통해 그룹마다 문서 수를 카운트합니다.
- $sort: count 필드를 기준으로 내림차순(-1) 정렬하여 등장 횟수가 많은 순서대로 배치합니다.
- $limit: 결과 중 상위 5개만 반환합니다.
쿼리를 실행하면 다음과 같은 출력 결과가 나타납니다.
{ "_id" : "Chris", "count" : 3 }
{ "_id" : "Bob", "count" : 2 }
{ "_id" : "David", "count" : 1 }결과를 보면 Chris가 3회로 가장 많이 등장했고, Bob이 2회, David가 1회로 뒤를 이었습니다. 이처럼 $group, $sort, $limit 세 단계를 조합하면 MongoDB에서 손쉽게 최다 등장 사용자 순위를 집계할 수 있습니다.