MongoDB에서 고유한 값만 조회하는 방법
MongoDB에서 컬렉션에 저장된 필드 값들 중 중복을 제거하고 고유한(distinct) 값만 반환하고 싶다면, distinct() 메서드를 사용하면 됩니다. 이 메서드는 지정한 필드의 모든 값을 스캔한 뒤, 중복된 값을 하나로 합쳐 배열 형태로 결과를 돌려줍니다.
distinct() 기본 문법
db.컬렉션이름.distinct("필드이름");필요에 따라 두 번째 인자로 쿼리 조건(query filter)을 전달하여, 특정 조건을 만족하는 문서들에서만 고유한 값을 추출할 수도 있습니다.
예제용 컬렉션 생성하기
개념을 쉽게 이해하기 위해 먼저 샘플 문서가 담긴 컬렉션을 만들어 보겠습니다. 아래는 문서를 삽입하는 쿼리입니다.
> db.returnOnlyUniqueValuesDemo.insertOne({"CustomerName":"Larry","CustomerAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ed7262f684a30fbdfd580")
}
> db.returnOnlyUniqueValuesDemo.insertOne({"CustomerName":"Mike","CustomerAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ed72d2f684a30fbdfd581")
}
> db.returnOnlyUniqueValuesDemo.insertOne({"CustomerName":"Sam","CustomerAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ed7322f684a30fbdfd582")
}
> db.returnOnlyUniqueValuesDemo.insertOne({"CustomerName":"Carol","CustomerAge":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ed73a2f684a30fbdfd583")
}
> db.returnOnlyUniqueValuesDemo.insertOne({"CustomerName":"David","CustomerAge":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ed74a2f684a30fbdfd584")
}
> db.returnOnlyUniqueValuesDemo.insertOne({"CustomerName":"Chris","CustomerAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ed7582f684a30fbdfd585")
}위 예제에서는 6명의 고객 데이터를 삽입했습니다. 주목할 점은 나이(CustomerAge) 값에 중복이 있다는 것입니다. 21살과 23살이 각각 두 명씩 존재합니다.
저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.returnOnlyUniqueValuesDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8ed7262f684a30fbdfd580"),
"CustomerName" : "Larry",
"CustomerAge" : 23
}
{
"_id" : ObjectId("5c8ed72d2f684a30fbdfd581"),
"CustomerName" : "Mike",
"CustomerAge" : 21
}
{
"_id" : ObjectId("5c8ed7322f684a30fbdfd582"),
"CustomerName" : "Sam",
"CustomerAge" : 21
}
{
"_id" : ObjectId("5c8ed73a2f684a30fbdfd583"),
"CustomerName" : "Carol",
"CustomerAge" : 25
}
{
"_id" : ObjectId("5c8ed74a2f684a30fbdfd584"),
"CustomerName" : "David",
"CustomerAge" : 22
}
{
"_id" : ObjectId("5c8ed7582f684a30fbdfd585"),
"CustomerName" : "Chris",
"CustomerAge" : 23
}distinct()로 고유한 값만 반환하기
이제 distinct() 메서드를 사용해 CustomerAge 필드의 중복 없는 값만 조회해 보겠습니다.
> db.returnOnlyUniqueValuesDemo.distinct("CustomerAge");실행 결과는 다음과 같습니다.
[ 23, 21, 25, 22 ]
결과 분석
원본 데이터에는 나이 값이 총 6개(23, 21, 21, 25, 22, 23) 있었지만, distinct()를 적용한 결과 중복이 제거되어 [23, 21, 25, 22]라는 4개의 고유한 값만 배열로 반환된 것을 확인할 수 있습니다.
참고: 집계 파이프라인으로도 가능합니다
조건이 더 복잡하거나 정렬·개수 세기 등 추가 작업이 필요한 경우에는 aggregate()와 $group 연산자를 활용하는 방법도 있습니다.
db.returnOnlyUniqueValuesDemo.aggregate([
{ $group: { _id: "$CustomerAge" } }
]);간단한 중복 제거라면 distinct()가 가장 직관적이고 효율적인 선택입니다.