MongoDB에서 특정 값의 개수 빠르게 조회하는 방법
데이터가 많은 컬렉션에서 특정 값의 개수를 조회할 때는 인덱스(index)를 미리 생성해 두면 쿼리 성능을 크게 향상시킬 수 있습니다. 개수를 구할 때는 count() 메서드를 사용하면 됩니다. 아래 예제를 통해 전체 과정을 살펴보겠습니다.
1. 인덱스 생성 및 샘플 데이터 입력
먼저 Name 필드에 오름차순(1) 인덱스를 생성합니다.
> db.demo311.ensureIndex({"Name":1});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}이어서 demo311 컬렉션에 여러 개의 문서(document)를 삽입합니다.
> db.demo311.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50cd01f8647eb59e562044")
}
> db.demo311.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50cd05f8647eb59e562045")
}
> db.demo311.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50cd06f8647eb59e562046")
}
> db.demo311.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50cd0af8647eb59e562047")
}
> db.demo311.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50cd0df8647eb59e562048")
}
> db.demo311.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50cd0ff8647eb59e562049")
}2. 컬렉션의 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo311.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e50cd01f8647eb59e562044"), "Name" : "Chris" }
{ "_id" : ObjectId("5e50cd05f8647eb59e562045"), "Name" : "David" }
{ "_id" : ObjectId("5e50cd06f8647eb59e562046"), "Name" : "David" }
{ "_id" : ObjectId("5e50cd0af8647eb59e562047"), "Name" : "Chris" }
{ "_id" : ObjectId("5e50cd0df8647eb59e562048"), "Name" : "Bob" }
{ "_id" : ObjectId("5e50cd0ff8647eb59e562049"), "Name" : "Chris" }3. 특정 값의 개수 구하기
다음과 같이 조건을 지정한 뒤 count()를 호출하면 해당 값의 개수를 즉시 얻을 수 있습니다.
> db.demo311.find({"Name":"Chris"}).count();실행 결과는 다음과 같습니다.
3
결과를 통해 Name 필드가 "Chris"인 문서가 총 3개 존재함을 확인할 수 있습니다. 인덱스가 설정되어 있기 때문에 대용량 데이터에서도 빠른 속도로 개수를 집계할 수 있습니다.
참고 사항
MongoDB 3.0 이상 버전에서는 ensureIndex()가 deprecated(사용 중단 권고)되었으므로, 대신 createIndex()를 사용하는 것이 좋습니다. 또한 정확한 개수만 필요하다면 countDocuments()나 estimatedDocumentCount() 같은 최신 카운트 메서드를 활용하는 것도 고려해 볼 수 있습니다.