MongoDB에서 중첩 객체(내장 문서)의 특정 필드를 기준으로 데이터를 그룹화하려면 점 표기법(dot notation)과 $group 연산자를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 중첩 객체에 대한 그룹 쿼리를 작성하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 clientDetails라는 중첩 객체를 포함한 문서들을 컬렉션에 삽입합니다.
> db.demo617.insertOne(
... {
... "clientDetails": {
... "Name": "Chris",
... "Age": 32,
... "Project": "Online Library Management System"
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99d2b86c954c74be91e69b")
}> db.demo617.insertOne(
... {
... "clientDetails": {
... "Name": "David",
... "Age": 34,
... "Project": "Online Hospital Management System"
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99d2b86c954c74be91e69c")
}> db.demo617.insertOne(
... {
... "clientDetails": {
... "Name": "David",
... "Age": 34,
... "Project": "Online Library Management System"
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99d2b96c954c74be91e69d")
}2. 저장된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo617.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e99d2b86c954c74be91e69b"), "clientDetails" : { "Name" : "Chris", "Age" : 32, "Project" : "Online Library Management System" } }
{ "_id" : ObjectId("5e99d2b86c954c74be91e69c"), "clientDetails" : { "Name" : "David", "Age" : 34, "Project" : "Online Hospital Management System" } }
{ "_id" : ObjectId("5e99d2b96c954c74be91e69d"), "clientDetails" : { "Name" : "David", "Age" : 34, "Project" : "Online Library Management System" } }3. 중첩 객체에 대한 그룹 쿼리 실행하기
이제 핵심 부분입니다. 중첩 객체 내부의 필드를 기준으로 그룹화하려면 $group 연산자와 함께 "$clientDetails.Project"처럼 점 표기법으로 경로를 지정합니다. 여기에 $sum: 1을 사용해 각 그룹의 문서 개수를 집계합니다.
> db.demo617.aggregate({ $group : {_id : "$clientDetails.Project", All : { $sum : 1 }} });실행 결과는 다음과 같습니다.
{ "_id" : "Online Hospital Management System", "All" : 1 }
{ "_id" : "Online Library Management System", "All" : 2 }결과 해석
출력 결과를 보면 프로젝트 이름별로 문서가 성공적으로 그룹화되었습니다. "Online Library Management System" 프로젝트는 2개의 문서가 해당되고, "Online Hospital Management System" 프로젝트는 1개의 문서가 해당됩니다.
핵심 정리
- 중첩 객체의 필드에 접근할 때는 점 표기법(예:
"$clientDetails.Project")을 사용합니다. - $group 연산자의
_id값에 그룹화 기준이 되는 필드 경로를 지정합니다. $sum: 1을 활용하면 각 그룹에 속한 문서의 개수를 손쉽게 계산할 수 있습니다.- 집계 파이프라인이 필요하므로
find()가 아닌aggregate()메서드를 사용해야 합니다.
이 방식은 고객 데이터 분석, 프로젝트별 통계 산출 등 실무에서 중첩된 문서 구조를 다룰 때 매우 유용하게 활용됩니다.