MongoDB에서 서로 다른 두 개의 배열 필드를 하나로 합쳐야 할 때가 있습니다. 이럴 때 가장 간단하고 효율적인 방법은 집계 파이프라인(aggregate)에서 $setUnion 연산자를 사용하는 것입니다.
$setUnion은 두 배열을 마치 집합(set)처럼 취급하여 병합하며, 중복된 값은 자동으로 제거하고 결과를 오름차순으로 정렬해 반환합니다.
1. 샘플 컬렉션 생성하기
먼저 두 개의 배열 필드를 가진 문서를 포함하는 컬렉션을 생성해 보겠습니다.
> db.mergeTwoArrayFieldDemo.insertOne({"NaturalNumbers":[1,2,3,8,10,20,30],"WholeNumbers":[0,1,2,63,78,20,45]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd68e4057806ebf1256f11d")
}위 명령은 NaturalNumbers와 WholeNumbers라는 두 개의 배열 필드를 가진 문서 하나를 삽입합니다.
2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.mergeTwoArrayFieldDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd68e4057806ebf1256f11d"),
"NaturalNumbers" : [
1,
2,
3,
8,
10,
20,
30
],
"WholeNumbers" : [
0,
1,
2,
63,
78,
20,
45
]
}3. $setUnion으로 두 배열 필드 병합하기
이제 aggregate() 메서드와 $project 단계를 조합하여 두 배열 필드를 새로운 필드 MergedArray로 병합해 보겠습니다.
> db.mergeTwoArrayFieldDemo.aggregate([
{ "$project": {
"MergedArray": { "$setUnion": [ "$NaturalNumbers", "$WholeNumbers" ] }
}}
]);실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cd68e4057806ebf1256f11d"), "MergedArray" : [ 0, 1, 2, 3, 8, 10, 20, 30, 45, 63, 78 ] }결과 분석 및 참고 사항
출력 결과를 보면 두 배열이 성공적으로 하나로 합쳐진 것을 확인할 수 있습니다. 몇 가지 주목할 점은 다음과 같습니다.
- 중복 제거: 원래 두 배열에 모두 존재하던 값(1, 2, 20)은 결과에서 한 번만 나타납니다.
- 자동 정렬: 병합된 배열은 입력 순서와 무관하게 오름차순으로 정렬됩니다.
- 새 필드 생성: $project 단계에서 지정한 이름(
MergedArray)으로 병합 결과가 담긴 새로운 필드가 생성됩니다.
만약 중복 값을 유지한 채 단순히 배열을 이어 붙이고 싶다면 $concatArrays 연산자를 사용하는 것이 적합합니다. 반면, 고유한 값만 필요하거나 정렬된 결과가 필요하다면 $setUnion이 가장 좋은 선택입니다.