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

MongoDB 집계로 필드를 결합·병합한 후 개수 계산하는 방법

MongoDB에서 필드를 결합하거나 병합한 뒤 카운트하기

MongoDB에서 여러 문서의 특정 필드를 그룹화(결합 또는 병합)한 다음 각 그룹별 개수를 계산하려면 $group 연산자와 함께 $sum, $sort를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용해 데모용 컬렉션에 문서를 삽입합니다.

> db.demo647.insertOne({"Subject":"MySQL"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e9c86316c954c74be91e6ee")
}
> db.demo647.insertOne({"Subject":"MongoDB"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e9c86356c954c74be91e6ef")
}
> db.demo647.insertOne({"Subject":"MySQL"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e9c86376c954c74be91e6f0")
}
> db.demo647.insertOne({"Subject":"SQL Server"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e9c86406c954c74be91e6f1")
}
> db.demo647.insertOne({"Subject":"MongoDB"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e9c86436c954c74be91e6f2")
}
> db.demo647.insertOne({"Subject":"PL/SQL"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e9c864b6c954c74be91e6f3")
}
> db.demo647.insertOne({"Subject":"MongoDB"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e9c86c16c954c74be91e6f4")
}

위 명령은 Subject 필드를 가진 7개의 문서를 생성합니다. 과목은 MySQL, MongoDB, SQL Server, PL/SQL이며 MongoDB는 총 3번, MySQL은 2번 삽입되었습니다.

2. find()로 전체 문서 조회하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.

> db.demo647.find();

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

{ "_id" : ObjectId("5e9c86316c954c74be91e6ee"), "Subject" : "MySQL" }
{ "_id" : ObjectId("5e9c86356c954c74be91e6ef"), "Subject" : "MongoDB" }
{ "_id" : ObjectId("5e9c86376c954c74be91e6f0"), "Subject" : "MySQL" }
{ "_id" : ObjectId("5e9c86406c954c74be91e6f1"), "Subject" : "SQL Server" }
{ "_id" : ObjectId("5e9c86436c954c74be91e6f2"), "Subject" : "MongoDB" }
{ "_id" : ObjectId("5e9c864b6c954c74be91e6f3"), "Subject" : "PL/SQL" }
{ "_id" : ObjectId("5e9c86c16c954c74be91e6f4"), "Subject" : "MongoDB" }

3. 집계 파이프라인으로 그룹화 후 카운트하기

필드를 결합·병합한 후 개수를 계산하는 핵심 쿼리는 다음과 같습니다. $group으로 Subject 값을 기준으로 묶고, $sum: 1로 각 그룹의 문서 수를 세며, $sort로 내림차순 정렬한 뒤 $limit으로 상위 결과만 가져옵니다.

> db.demo647.aggregate([
   { "$group": { "_id": "$Subject", "COUNT": { "$sum": 1 } } },
   { "$sort": { "COUNT": -1 } },
   { "$limit": 2 }
] );

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

{ "_id" : "MongoDB", "COUNT" : 3 }
{ "_id" : "MySQL", "COUNT" : 2 }

쿼리 동작 원리 정리

  • $group: _id: "$Subject"를 지정하여 같은 Subject 값을 가진 문서들을 하나의 그룹으로 결합합니다.
  • $sum: 1: 그룹에 속한 문서마다 1씩 더해 해당 그룹의 총 개수(COUNT)를 계산합니다.
  • $sort: { COUNT: -1 }: 개수가 많은 순서대로 내림차순 정렬합니다.
  • $limit: 2: 정렬된 결과 중 상위 2개만 반환합니다.

결과적으로 MongoDB가 3건으로 가장 많고, MySQL이 2건으로 두 번째임을 한눈에 확인할 수 있습니다. 이처럼 집계 파이프라인을 활용하면 데이터를 유연하게 그룹화하고 통계를 손쉽게 도출할 수 있습니다.