MongoDB에서 특정 필드의 고유한 값(unique values)만 추출하고 중복된 데이터는 제외하고 싶을 때가 있습니다. 이럴 때 사용하는 것이 바로 distinct() 메서드입니다. distinct()는 단일 컬렉션 내에서 지정된 필드의 중복되지 않은 값을 모두 찾아 배열(array) 형태로 반환해 줍니다.
1. 예제용 컬렉션 생성
먼저 실습을 위해 문서(document) 여러 개를 포함하는 컬렉션을 만들어 보겠습니다. 의도적으로 중복된 값(hi, fo)도 함께 삽입했습니다.
> db.demo704.insertOne({"LanguageCode":"hi"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ee18551299a9f98c93bd")
}
> db.demo704.insertOne({"LanguageCode":"en"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ee1e551299a9f98c93be")
}
> db.demo704.insertOne({"LanguageCode":"hi"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ee20551299a9f98c93bf")
}
> db.demo704.insertOne({"LanguageCode":"eo"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ee2c551299a9f98c93c0")
}
> db.demo704.insertOne({"LanguageCode":"eu"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ee2f551299a9f98c93c1")
}
> db.demo704.insertOne({"LanguageCode":"fo"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ee35551299a9f98c93c2")
}
> db.demo704.insertOne({"LanguageCode":"fo"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ee37551299a9f98c93c3")
}2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo704.find();
위 쿼리를 실행하면 아래와 같은 출력 결과를 얻을 수 있습니다.
{ "_id" : ObjectId("5ea6ee18551299a9f98c93bd"), "LanguageCode" : "hi" }
{ "_id" : ObjectId("5ea6ee1e551299a9f98c93be"), "LanguageCode" : "en" }
{ "_id" : ObjectId("5ea6ee20551299a9f98c93bf"), "LanguageCode" : "hi" }
{ "_id" : ObjectId("5ea6ee2c551299a9f98c93c0"), "LanguageCode" : "eo" }
{ "_id" : ObjectId("5ea6ee2f551299a9f98c93c1"), "LanguageCode" : "eu" }
{ "_id" : ObjectId("5ea6ee35551299a9f98c93c2"), "LanguageCode" : "fo" }
{ "_id" : ObjectId("5ea6ee37551299a9f98c93c3"), "LanguageCode" : "fo" }출력 결과를 보면 총 7개의 문서 중 hi와 fo가 각각 두 번씩 중복되어 저장되어 있는 것을 확인할 수 있습니다.
3. distinct()로 고유한 값 조회하기
이제 distinct() 메서드를 사용하여 LanguageCode 필드의 고유한 값만 배열로 추출해 보겠습니다.
> db.demo704.distinct("LanguageCode");실행 결과는 다음과 같습니다.
[ "hi", "en", "eo", "eu", "fo" ]
정리
distinct("필드명")은 해당 필드의 중복을 제거한 값을 배열로 반환합니다.- 조건(query)을 두 번째 인자로 전달하면 조건에 맞는 문서만 대상으로 고유 값을 추출할 수 있습니다. 예:
db.demo704.distinct("LanguageCode", {"LanguageCode": "hi"}) - 반환 결과는 항상 배열 형태이므로 애플리케이션에서 바로 활용하기 편리합니다.