MongoDB에서 배열 필드에 포함된 중복 값을 제거하려면 집계 파이프라인(aggregate)과 $group 연산자를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 컬렉션을 생성하고, 중복된 배열 값을 제거하는 전체 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 테스트용 컬렉션 demo649에 문서를 삽입합니다.
> db.demo649.insertOne(
... { "_id" : 101, "Names" : [ "John", "Bob", "Bob", "Robert" ], "CountryName" : "US" }
... );
{ "acknowledged" : true, "insertedId" : 101 }
>
> db.demo649.insertOne({ "_id" :102, "Names" : [ "John", "Robert" ], "CountryName" : "UK"});
{ "acknowledged" : true, "insertedId" : 102 }위 코드에서 첫 번째 문서(_id: 101)의 Names 배열에는 "Bob"이 두 번 포함되어 있어 중복 값이 존재합니다.
2. find()로 전체 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo649.find();
실행 결과는 다음과 같습니다.
{ "_id" : 101, "Names" : [ "John", "Bob", "Bob", "Robert" ], "CountryName" : "US" }
{ "_id" : 102, "Names" : [ "John", "Robert" ], "CountryName" : "UK" }3. 집계 파이프라인으로 중복 값 제거하기
중복 제거의 핵심은 다음 두 단계입니다.
- $unwind: Names 배열의 각 요소를 개별 문서로 분해합니다.
- $group + $addToSet: _id를 기준으로 다시 그룹화하면서 $addToSet 연산자로 중복 없는 고유한 값만 배열로 재구성합니다.
실제 집계 쿼리는 다음과 같습니다.
> db.demo649.aggregate(
... { $unwind : "$Names"},
... { $group : { _id : "$_id" , Names : { $addToSet : "$Names" } ,
... CountryName : { $first : "$CountryName" }}}
... )실행 결과는 다음과 같습니다.
{ "_id" : 102, "Names" : [ "Robert", "John" ], "CountryName" : "UK" }
{ "_id" : 101, "Names" : [ "Robert", "Bob", "John" ], "CountryName" : "US" }결과를 보면 _id가 101인 문서의 Names 배열에서 중복되던 "Bob"이 하나만 남은 것을 확인할 수 있습니다.
핵심 정리
- $unwind는 배열 필드를 개별 문서로 펼쳐 주는 단계입니다.
- $addToSet은 집합(set)처럼 동작하여 중복 값을 자동으로 제거합니다.
- $first는 그룹화 대상이 아닌 다른 필드(CountryName 등)의 첫 번째 값을 유지할 때 사용합니다.
참고로 $addToSet은 결과 배열의 순서를 보장하지 않으므로, 특정 순서가 필요하다면 파이프라인 마지막에 $sort 단계를 추가로 적용하는 것이 좋습니다.