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

MongoDB 집계(Aggregation)로 여러 문서를 배열이 포함된 단일 문서로 변환하는 방법

MongoDB에서 여러 개의 개별 문서를 하나의 단일 문서로 묶고 싶을 때가 있습니다. 예를 들어 동일한 ID를 가진 여러 레코드를 하나의 그룹으로 합치면서, 각 레코드의 세부 정보는 배열 형태로 보관하고 싶은 경우가 대표적입니다. 이럴 때 aggregate() 메서드와 $group, $push 연산자를 활용하면 손쉽게 해결할 수 있습니다.

1. 샘플 컬렉션 생성하기

먼저 실습에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.demo248.insertOne({"id":101,"Name":"Chris","Age":21,"CountryName":"US"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e46b6651627c0c63e7dba6d")
}
> db.demo248.insertOne({"id":101,"Name":"Bob","Age":22,"CountryName":"UK"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e46b6741627c0c63e7dba6e")
}
> db.demo248.insertOne({"id":102,"Name":"Mike","Age":20,"CountryName":"AUS"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e46b6811627c0c63e7dba6f")
}

위 코드에서는 demo248이라는 컬렉션에 3개의 문서를 삽입했습니다. 주목할 점은 id가 101인 문서가 두 개라는 것입니다. 이 두 문서가 집계 과정에서 하나의 그룹으로 묶이게 됩니다.

2. 저장된 문서 확인하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo248.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e46b6651627c0c63e7dba6d"), "id" : 101, "Name" : "Chris", "Age" : 21, "CountryName" : "US" }
{ "_id" : ObjectId("5e46b6741627c0c63e7dba6e"), "id" : 101, "Name" : "Bob", "Age" : 22, "CountryName" : "UK" }
{ "_id" : ObjectId("5e46b6811627c0c63e7dba6f"), "id" : 102, "Name" : "Mike", "Age" : 20, "CountryName" : "AUS" }

3. 집계 쿼리로 여러 문서를 하나로 변환하기

이제 여러 문서를 배열이 포함된 단일 문서로 변환하는 집계 쿼리를 살펴보겠습니다. $group 스테이지로 id 필드를 기준으로 문서들을 그룹화하고, $push 연산자를 사용해 각 문서의 세부 정보를 details 배열에 담습니다.

> db.demo248.aggregate([
...    {
...       $group : {
...          _id : "$id",
...          details : {
...             $push : {
...                id:"$id",
...                Name:"$Name",
...                Age:"$Age",
...                CountryName:"$CountryName"
...             }
...          }
...       }
...    }
...])

4. 실행 결과 확인하기

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : 102, "details" : [ { "id" : 102, "Name" : "Mike", "Age" : 20, "CountryName" : "AUS" } ] }
{ "_id" : 101, "details" : [ { "id" : 101, "Name" : "Chris", "Age" : 21, "CountryName" : "US" }, { "id" : 101, "Name" : "Bob", "Age" : 22, "CountryName" : "UK" } ] }

결과 분석

출력 결과를 보면 원래 3개였던 문서가 2개의 그룹으로 정리된 것을 확인할 수 있습니다.

  • _id: 102 — Mike 문서 하나만 해당되므로 details 배열에는 요소가 1개만 들어 있습니다.
  • _id: 101 — Chris와 Bob 두 문서가 같은 id 값을 가지므로 details 배열에 두 요소가 함께 포함되었습니다.

즉, $group으로 기준 필드별로 묶고 $push로 세부 데이터를 배열에 누적하는 방식이 MongoDB에서 여러 문서를 배열이 있는 단일 문서로 변환하는 핵심 패턴입니다. 이 기법은 주문 내역을 고객별로 묶거나, 로그 데이터를 날짜별로 그룹화하는 등 실무에서 매우 자주 활용됩니다.