MongoDB distinct() 메서드로 고유한 값 추출하기
MongoDB에서 컬렉션의 특정 필드(열)에 저장된 값 중 중복을 제거한 고유한 값만 조회하려면 distinct() 메서드를 사용하면 됩니다. 이 메서드는 지정한 필드의 모든 값을 스캔한 뒤, 중복을 제거한 배열 형태로 결과를 반환합니다.
실제 동작을 확인하기 위해 먼저 샘플 문서들이 담긴 컬렉션을 생성해 보겠습니다.
1. 샘플 컬렉션 생성
insertOne() 메서드를 사용해 demo128 컬렉션에 여러 개의 문서를 삽입합니다. 의도적으로 같은 이름이 반복되도록 데이터를 구성했습니다.
> db.demo128.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e30583d68e7f832db1a7f5d")
}
> db.demo128.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e30584068e7f832db1a7f5e")
}
> db.demo128.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e30584368e7f832db1a7f5f")
}
> db.demo128.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e30584668e7f832db1a7f60")
}
> db.demo128.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e30584c68e7f832db1a7f61")
}위 실행 결과를 보면 총 5개의 문서가 삽입되었으며, 그중 "Chris"와 "David"는 각각 두 번씩 저장되어 있습니다.
2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo128.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e30583d68e7f832db1a7f5d"), "Name" : "Chris" }
{ "_id" : ObjectId("5e30584068e7f832db1a7f5e"), "Name" : "David" }
{ "_id" : ObjectId("5e30584368e7f832db1a7f5f"), "Name" : "David" }
{ "_id" : ObjectId("5e30584668e7f832db1a7f60"), "Name" : "Bob" }
{ "_id" : ObjectId("5e30584c68e7f832db1a7f61"), "Name" : "Chris" }출력 결과에서 확인할 수 있듯이, Name 필드에는 "Chris", "David", "Bob" 세 가지 이름이 있지만 "Chris"와 "David"는 중복되어 저장되어 있습니다.
3. distinct()로 고유한 값만 조회하기
이제 Name 필드의 중복을 제거하고 고유한 값만 가져오는 쿼리를 실행해 보겠습니다.
> db.demo128.distinct("Name");실행 결과는 다음과 같습니다.
[ "Chris", "David", "Bob" ]
결과를 보면 중복된 값이 모두 제거되고, Name 필드에 존재하는 고유한 값들만 배열 형태로 반환된 것을 확인할 수 있습니다.
distinct() 메서드 활용 팁
- 조건 추가: distinct()의 두 번째 인자에 쿼리 조건을 전달하면 특정 조건을 만족하는 문서들만 대상으로 고유한 값을 추출할 수 있습니다. 예:
db.demo128.distinct("Name", {"Name": {$ne: "Bob"}}) - 반환 형식: 결과는 항상 배열(Array) 형태로 반환되므로 애플리케이션에서 바로 활용하기 편리합니다.
- 인덱스 활용: 해당 필드에 인덱스가 설정되어 있다면 distinct() 연산의 성능이 크게 향상됩니다.
이처럼 MongoDB의 distinct() 메서드를 사용하면 SQL의 SELECT DISTINCT와 유사하게 손쉽게 중복 없는 고유한 값 목록을 얻을 수 있습니다.