MongoDB에서 쿼리 결과로 만들어지는 배열의 크기를 정확하게 계산하려면 distinct() 메서드로 고유한 요소만 먼저 추출한 다음, JavaScript의 length 속성을 사용하면 됩니다.
기본 문법
db.yourCollectionName.distinct('yourFieldName').length;distinct()는 지정한 필드에서 중복을 제거한 고유한 값들의 배열을 반환합니다. 여기에 .length를 붙이면 해당 필드에 서로 다른 값이 몇 개 있는지 한 번에 확인할 수 있습니다.
1단계: 예제 컬렉션 생성
먼저 실습에 사용할 컬렉션과 문서들을 생성해 보겠습니다.
> db.countOrSizeDemo.insertOne({"StudentFirstName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd304f5b64f4b851c3a13dc")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd304fab64f4b851c3a13dd")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd304fcb64f4b851c3a13de")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"Carol"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd30500b64f4b851c3a13df")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"Sam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd30505b64f4b851c3a13e0")
}
> db.countOrSizeDemo.insertOne({"StudentFirstName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd3050ab64f4b851c3a13e1")
}위 예제에서는 총 6개의 문서를 삽입했습니다. 이때 "John"과 "David"는 각각 두 번씩 중복되어 저장되었다는 점에 주목하세요.
2단계: 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.countOrSizeDemo.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cd304f5b64f4b851c3a13dc"), "StudentFirstName" : "John" }
{ "_id" : ObjectId("5cd304fab64f4b851c3a13dd"), "StudentFirstName" : "David" }
{ "_id" : ObjectId("5cd304fcb64f4b851c3a13de"), "StudentFirstName" : "David" }
{ "_id" : ObjectId("5cd30500b64f4b851c3a13df"), "StudentFirstName" : "Carol" }
{ "_id" : ObjectId("5cd30505b64f4b851c3a13e0"), "StudentFirstName" : "Sam" }
{ "_id" : ObjectId("5cd3050ab64f4b851c3a13e1"), "StudentFirstName" : "John" }3단계: 쿼리 배열의 크기 계산하기
이제 distinct() 메서드와 length 속성을 조합하여 StudentFirstName 필드의 고유한 값 개수, 즉 배열의 크기를 구해 보겠습니다.
> db.countOrSizeDemo.distinct('StudentFirstName').length;실행 결과는 다음과 같습니다.
4
전체 문서는 6개였지만, 중복을 제거한 고유한 학생 이름은 John, David, Carol, Sam으로 총 4개이므로 결과가 4로 출력됩니다.
참고: 단순 문서 수를 세고 싶다면?
중복 제거 없이 조건에 맞는 문서의 개수만 필요하다면 distinct() 대신 countDocuments() 메서드를 사용하는 것이 더 효율적입니다.
db.countOrSizeDemo.countDocuments({}); // 전체 문서 수: 6