MongoDB에서는 집계 파이프라인의 $group 연산자와 점 표기법(dot notation)을 함께 사용하면 배열 필드 안에 있는 값들을 손쉽게 그룹화할 수 있습니다. 이 글에서는 실제 예제를 통해 문서를 생성하고, find()로 데이터를 확인한 뒤, 점 표기법을 활용해 레코드를 그룹화하는 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 documents가 포함된 컬렉션을 생성합니다.
> db.demo430.insertOne(
... {
... "details": [
... {
... "Name":"Chris"
... },
... {"Name":"David"},
... {"Name":"Adam"},
... {"Name":"Bob"}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e7702ddbbc41e36cc3cae88")
}2. find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo430.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e7702ddbbc41e36cc3cae88"), "details" : [ { "Name" : "Chris" }, { "Name" : "David" }, { "Name" : "Adam" }, { "Name" : "Bob" } ] }3. 점 표기법으로 레코드 그룹화하기
이제 aggregate()와 $group 연산자를 사용하여 레코드를 그룹화합니다. 이때 $details.Name처럼 점 표기법을 사용하면 details 배열 내부의 Name 필드 값들을 한 번에 참조할 수 있습니다.
> db.demo430.aggregate([{ "$group" : { "_id" : {"Name" : "$details.Name"}}}]));실행 결과는 다음과 같습니다.
{ "_id" : { "Name" : [ "Chris", "David", "Adam", "Bob" ] } }동작 원리 정리
점 표기법($details.Name)은 MongoDB가 배열 내 각 요소의 Name 필드를 자동으로 순회하도록 만듭니다. $group 단계에서 이 값을 _id로 지정하면, 배열에 담긴 모든 이름들이 하나의 그룹 키로 묶여 위와 같은 결과가 반환됩니다.
이 방식은 중첩된 문서 구조나 배열 필드를 다룰 때 매우 유용하며, 별도의 $unwind 단계 없이도 간단하게 그룹화 작업을 수행할 수 있다는 장점이 있습니다.