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에서 여러 문서를 배열이 있는 단일 문서로 변환하는 핵심 패턴입니다. 이 기법은 주문 내역을 고객별로 묶거나, 로그 데이터를 날짜별로 그룹화하는 등 실무에서 매우 자주 활용됩니다.