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

MongoDB에서 여러 문서를 병합하는 방법: aggregate() 활용 가이드

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: _idName 필드를 기준으로 문서를 오름차순으로 정렬합니다.
  • $unwind: details 배열을 개별 문서로 분해하여 각 요소를 독립적으로 처리할 수 있게 합니다.
  • $group: Name 필드를 기준으로 문서를 그룹화하고, $push로 details 배열 요소를 모으며, $sum으로 Price 값을 합산합니다. 또한 $last$concat을 사용해 새로운 _id 값을 생성합니다.
  • $addFields: 새로운 Id 필드를 추가하고 _id를 앞서 생성한 값으로 대체합니다.
  • $project: 임시로 사용된 id 필드를 최종 결과에서 제외합니다.

최종 결과를 보면 이름이 Chris인 세 개의 문서가 하나로 병합되어, details 배열에는 세 개의 객체가 모두 포함되고 Price 값은 50 + 78 + 50 = 178로 합산된 것을 확인할 수 있습니다. 이처럼 aggregate() 파이프라인을 활용하면 조건에 맞는 여러 문서를 유연하게 병합할 수 있습니다.