MongoDB에서 여러 문서를 병합하는 방법
MongoDB에서 여러 개의 문서를 하나로 병합하려면 aggregate() 메서드를 사용하면 됩니다. 집계 파이프라인의 $sort, $unwind, $group 등의 단계를 조합하면 동일한 키를 가진 문서들을 하나로 묶고, 배열 데이터를 모으거나 숫자 값을 합산할 수 있습니다.
먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.demo436.insertOne(
... {
... "_id" : "101",
... "Name": "Chris",
... "details" : [
... {
... "CountryName" : "US",
... "Age" : 21
... }
... ],
... "Price" : 50
... }
... );
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo436.insertOne(
... {
... "_id" : "102",
... "Name": "Chris",
... "details" : [
... {
... "CountryName" : "UK",
... "Age" : 22
... }
... ],
... "Price" : 78
... }
... );
{ "acknowledged" : true, "insertedId" : "102" }
> db.demo436.insertOne(
... {
... "_id" : "103",
... "Name": "Chris",
... "details" : [
... {
... "CountryName" : "US",
... "Age" : 21
... }
... ],
... "Price" : 50
... }
... );
{ "acknowledged" : true, "insertedId" : "103" }
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo436.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : "101", "Name" : "Chris", "details" : [ { "CountryName" : "US", "Age" : 21 } ], "Price" : 50 }
{ "_id" : "102", "Name" : "Chris", "details" : [ { "CountryName" : "UK", "Age" : 22 } ], "Price" : 78 }
{ "_id" : "103", "Name" : "Chris", "details" : [ { "CountryName" : "US", "Age" : 21 } ], "Price" : 50 }
여러 문서를 병합하는 쿼리 작성하기
다음은 MongoDB에서 여러 문서를 하나로 병합하는 집계 쿼리입니다.
> db.demo436.aggregate([
... {$sort: {_id: 1, Name: 1}},
... {$unwind: '$details'},
... {$group: {_id: '$Name', details: {$push: '$details'},
... Price: {$sum: '$Price'},
... id: {$last: {$concat: ["$_id", "_", "AppendedValue" ]}},
... Name: {$last: '$Name'}}},
... {$addFields: {Id: 'NewIdAppped', _id: '$id'}},
... {$project: {"id": 0 }}])
쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : "103_AppendedValue", "details" : [ { "CountryName" : "US", "Age" : 21 }, { "CountryName" : "UK", "Age" : 22 }, { "CountryName" : "US", "Age" : 21 } ], "Price" : 178, "Name" : "Chris", "Id" : "NewIdAppped" }
집계 파이프라인 단계 살펴보기
- $sort:
_id와Name필드를 기준으로 문서를 오름차순으로 정렬합니다. - $unwind:
details배열을 개별 문서로 분해하여 각 요소를 독립적으로 처리할 수 있게 합니다. - $group:
Name필드를 기준으로 문서를 그룹화하고,$push로 details 배열 요소를 모으며,$sum으로 Price 값을 합산합니다. 또한$last와$concat을 사용해 새로운_id값을 생성합니다. - $addFields: 새로운
Id필드를 추가하고_id를 앞서 생성한 값으로 대체합니다. - $project: 임시로 사용된
id필드를 최종 결과에서 제외합니다.
최종 결과를 보면 이름이 Chris인 세 개의 문서가 하나로 병합되어, details 배열에는 세 개의 객체가 모두 포함되고 Price 값은 50 + 78 + 50 = 178로 합산된 것을 확인할 수 있습니다. 이처럼 aggregate() 파이프라인을 활용하면 조건에 맞는 여러 문서를 유연하게 병합할 수 있습니다.