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

MongoDB에서 두 개의 배열 필드를 하나로 병합하는 방법 ($setUnion 연산자 활용)

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")
}

위 명령은 NaturalNumbersWholeNumbers라는 두 개의 배열 필드를 가진 문서 하나를 삽입합니다.

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이 가장 좋은 선택입니다.