배열 기반 필드에 포함된 고유 항목의 개수를 계산하려면 aggregate() 메서드와 함께 $unwind, $group 연산자를 사용하면 됩니다. 아래 예제를 통해 전체 과정을 단계별로 살펴보겠습니다.
1. 샘플 데이터 생성
먼저 insertOne() 메서드를 사용해 데모용 컬렉션에 문서를 삽입합니다.
> db.demo493.insertOne({"SubjectName":["MySQL","MongoDB","Java"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849f97b0f3fa88e22790c4")
}
> db.demo493.insertOne({"SubjectName":["C++","MongoDB","C"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849fa4b0f3fa88e22790c5")
}
> db.demo493.insertOne({"SubjectName":["MySQL","MongoDB","C"]});{
"acknowledged" : true,
"insertedId" : ObjectId("5e849fb2b0f3fa88e22790c6")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo493.find();
위 명령은 다음과 같은 출력을 반환합니다.
{ "_id" : ObjectId("5e849f97b0f3fa88e22790c4"), "SubjectName" : [ "MySQL", "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e849fa4b0f3fa88e22790c5"), "SubjectName" : [ "C++", "MongoDB", "C" ] }
{ "_id" : ObjectId("5e849fb2b0f3fa88e22790c6"), "SubjectName" : [ "MySQL", "MongoDB", "C" ] }3. 고유 항목 개수 계산하기
다음은 모든 문서에 걸쳐 배열 기반 필드의 고유 항목 개수를 계산하는 쿼리입니다. $unwind로 배열 요소를 개별 문서로 분리한 뒤, $group으로 각 항목별 등장 횟수를 집계합니다.
> db.demo493.aggregate([
{ $unwind: "$SubjectName" },
{ $group: { _id: "$SubjectName", Frequency: { $sum : 1 } } }
]
);실행 결과는 다음과 같습니다.
{ "_id" : "C++", "Frequency" : 1 }
{ "_id" : "C", "Frequency" : 2 }
{ "_id" : "Java", "Frequency" : 1 }
{ "_id" : "MySQL", "Frequency" : 2 }
{ "_id" : "MongoDB", "Frequency" : 3 }결과 해석
집계 결과를 보면 각 과목명이 전체 문서에서 몇 번 등장했는지 한눈에 확인할 수 있습니다. MongoDB는 3개 문서 모두에 포함되어 빈도수가 3이며, MySQL과 C는 각각 2번, C++과 Java는 1번씩 나타났습니다. 이처럼 $unwind와 $group의 조합은 배열 형태로 저장된 데이터의 통계 분석에 매우 유용하게 활용됩니다.