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

MongoDB 배열에서 중복 값 제거하는 방법 – $setUnion 연산자 활용법

MongoDB에서 배열(리스트) 내부의 중복 값을 제거하려면 애그리게이션 프레임워크(aggregation framework)$setUnion 연산자를 함께 사용하면 됩니다. $setUnion은 집합 연산을 수행하는 연산자로, 입력 배열을 하나의 집합으로 취급하기 때문에 자동으로 중복 요소가 제거되며, 결과는 오름차순으로 정렬됩니다.

1. 샘플 컬렉션 생성

먼저 문서를 포함한 컬렉션을 생성해 보겠습니다. 아래 예제에서는 강사 정보를 저장하는 컬렉션을 만들고, InstructorSubject 필드에 중복된 과목명이 포함된 배열을 삽입합니다.

> db.removeDuplicatesDemo.insertOne({"InstructorName":"Chris","InstructorAge":34,"InstructorSubject":
   ["Java","C","Java","C++","MongoDB","MySQL","MongoDB"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cb9d96c895c4fd159f80807")
}

2. 저장된 문서 확인

find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.

> db.removeDuplicatesDemo.find().pretty();

실행 결과는 다음과 같습니다. InstructorSubject 배열에 "Java"와 "MongoDB"가 각각 두 번씩 중복되어 있는 것을 확인할 수 있습니다.

{
   "_id" : ObjectId("5cb9d96c895c4fd159f80807"),
   "InstructorName" : "Chris",
   "InstructorAge" : 34,
   "InstructorSubject" : [
       "Java",
       "C",
       "Java",
       "C++",
       "MongoDB",
       "MySQL",
       "MongoDB"
   ]
}

3. $setUnion으로 중복 값 제거하기

다음은 aggregate() 파이프라인에서 $project 단계와 $setUnion 연산자를 조합하여 배열 내 중복 값을 제거하는 쿼리입니다. 빈 배열 []을 두 번째 인자로 전달하면 기존 배열과의 합집합을 구하게 되어, 중복이 제거된 고유한 값만 남게 됩니다.

> db.removeDuplicatesDemo.aggregate([
...    { "$project": {
...        "InstructorName":1,
...        "InstructorAge" :1,
...        "InstructorSubject" :{ "$setUnion": [ "$InstructorSubject", [] ] }
...    }}
... ]).pretty();

4. 실행 결과

쿼리 실행 후 출력 결과는 다음과 같습니다. 중복이 제거되었을 뿐만 아니라, $setUnion의 특성상 배열 요소가 알파벳 순으로 정렬된 것도 확인할 수 있습니다.

{
   "_id" : ObjectId("5cb9d96c895c4fd159f80807"),
   "InstructorName" : "Chris",
   "InstructorAge" : 34,
   "InstructorSubject" : [
       "C",
       "C++",
       "Java",
       "MongoDB",
       "MySQL"
   ]
}

참고 사항

$setUnion은 집합 연산자이므로 원본 배열의 순서는 유지되지 않고 항상 오름차순으로 정렬됩니다. 만약 중복 제거 결과를 실제 데이터에 반영하고 싶다면, 애그리게이션 파이프라인 마지막에 $out 또는 $merge 스테이지를 추가하여 새로운 컬렉션에 저장하거나 기존 컬렉션을 업데이트할 수 있습니다.