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

MongoDB에서 중첩 객체를 그룹화하는 쿼리 작성법 – $group과 점 표기법 활용하기

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() 메서드를 사용해야 합니다.

이 방식은 고객 데이터 분석, 프로젝트별 통계 산출 등 실무에서 중첩된 문서 구조를 다룰 때 매우 유용하게 활용됩니다.