MongoDB에서 여러 속성의 값을 단일 배열로 병합하기
값을 병합(coalesce)한다는 것은 여러 값을 하나로 합치는 것을 의미합니다. MongoDB에서 서로 다른 속성에 담긴 값들을 단일 배열로 합치려면 $project 연산자를 활용하면 됩니다.
이 과정을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 컬렉션을 만들고 문서를 삽입합니다.
> db.demo244.insertOne({"Value1":10,"Value2":20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4582e31627c0c63e7dba63")
}
> db.demo244.insertOne({"Value1":20,"Value2":30});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4582f11627c0c63e7dba64")
}2. find() 메서드로 문서 확인
find() 메서드를 사용해 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo244.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e4582e31627c0c63e7dba63"), "Value1" : 10, "Value2" : 20 }
{ "_id" : ObjectId("5e4582f11627c0c63e7dba64"), "Value1" : 20, "Value2" : 30 }3. 집계 파이프라인으로 값 병합
다음은 MongoDB 집계(aggregation)를 사용해 서로 다른 속성의 값들을 하나의 배열로 병합하는 쿼리입니다.
먼저 $group 단계에서 $addToSet 연산자를 사용해 각 필드의 고유한 값들을 개별 배열로 수집하고, 이어지는 $project 단계에서 $setUnion 연산자로 두 배열을 하나로 합칩니다.
> db.demo244.aggregate([
... { "$group": {
... "_id": null,
... "v1": { "$addToSet": "$Value1" },
... "v2": { "$addToSet": "$Value2" }
... }},
...
... { "$project": {
... "AllValues": { "$setUnion": [ "$v1", "$v2" ] }
... }}
...]);실행 결과는 다음과 같습니다.
{ "_id" : null, "AllValues" : [ 10, 20, 30 ] }핵심 포인트 정리
- $addToSet: 그룹 내에서 중복 없이 고유한 값만 배열에 추가합니다.
- $setUnion: 두 개 이상의 배열을 합치면서 중복 요소를 제거합니다.
- _id: null: 전체 컬렉션을 하나의 그룹으로 묶어 모든 문서의 값을 한 번에 처리합니다.
이처럼 MongoDB의 집계 파이프라인을 활용하면 분산되어 있는 여러 필드의 값을 손쉽게 하나의 배열로 통합할 수 있습니다.