MongoDB에서 두 개의 필드를 선택하고 중복을 제거한 고유(distinct) 값으로 정렬된 배열을 반환하려면 애그리게이션 프레임워크(aggregate framework)와 $setUnion 연산자를 함께 사용하면 됩니다.
1. 샘플 컬렉션 생성
먼저 테스트에 사용할 문서들을 담은 컬렉션을 생성합니다.
> db.sortedArrayWithDistinctDemo.insertOne(
... { value1: 4, value2: 5 }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc690b99cb58ca2b005e666")
}
> db.sortedArrayWithDistinctDemo.insertOne(
... { value1: 5, value2: 6 }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc690b99cb58ca2b005e667")
}
> db.sortedArrayWithDistinctDemo.insertOne(
... { value1: 7, value2: 4 }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc690b99cb58ca2b005e668")
}2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.sortedArrayWithDistinctDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5cc690b99cb58ca2b005e666"), "value1" : 4, "value2" : 5 }
{ "_id" : ObjectId("5cc690b99cb58ca2b005e667"), "value1" : 5, "value2" : 6 }
{ "_id" : ObjectId("5cc690b99cb58ca2b005e668"), "value1" : 7, "value2" : 4 }3. 두 필드의 고유 값을 정렬된 배열로 반환하는 쿼리
이제 두 개의 필드(value1, value2)를 선택하여 고유 값만 모아 정렬된 배열로 반환하는 애그리게이션 쿼리를 작성합니다.
쿼리의 동작 방식은 다음과 같습니다.
- $group: _id를 null로 지정해 전체 문서를 하나의 그룹으로 묶고, 각 필드의 값들을 $push로 배열에 수집합니다.
- $project: _id 필드는 제외(0)하고, $setUnion으로 두 배열을 합칩니다. $setUnion은 자동으로 중복을 제거하고 오름차순으로 정렬된 결과를 반환합니다.
> db.sortedArrayWithDistinctDemo.aggregate(
... [
... { "$group": {
... "_id": null,
... "value1": { "$push": "$value1" },
... "value2": { "$push": "$value2" }
... }},
... { "$project": {
... "_id": 0,
... "bothValues": { "$setUnion": [ "$value1", "$value2" ] }
... }}
... ]
... );4. 실행 결과
쿼리를 실행하면 두 필드의 값이 합쳐지고, 중복된 값(예: 4와 5)은 제거되어 정렬된 배열이 반환됩니다.
{ "bothValues" : [ 4, 5, 6, 7 ] }이처럼 $setUnion 연산자를 활용하면 별도의 정렬 단계 없이도 여러 필드의 값을 하나의 배열로 병합하면서 동시에 중복 제거와 정렬까지 한 번에 처리할 수 있습니다.