MongoDB distinct()로 특정 필드만 배열로 추출하기
MongoDB에서 전체 문서가 아닌 특정 필드의 값만 배열 형태로 가져오고 싶을 때가 있습니다. 예를 들어, 사용자 정보 중 전화번호만 모아서 확인해야 하는 경우가 대표적입니다. 이럴 때 distinct() 메서드를 활용하면 간단하게 해결할 수 있습니다.
1. 샘플 컬렉션 생성
먼저 실습에 사용할 컬렉션과 문서를 생성해 보겠습니다.
> db.demo166.insertOne({"details" : { "UserName" : "Chris", "UserAge":29, "PhoneDetails" : { "PhoneNumber" : "98646463533" } } });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e368b159e4f06af551997cf")
}
> db.demo166.insertOne({"details" : { "UserName" : "David", "UserAge":21, "PhoneDetails" : { "PhoneNumber" : "87664534654" } } });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e368b159e4f06af551997d0")
}위 코드는 두 명의 사용자(Chris, David) 정보를 담은 문서를 demo166 컬렉션에 삽입합니다. 각 문서는 이름, 나이, 그리고 중첩된 구조의 전화번호 정보를 포함하고 있습니다.
2. find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo166.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e368b159e4f06af551997cf"), "details" : { "UserName" : "Chris", "UserAge" : 29, "PhoneDetails" : { "PhoneNumber" : "98646463533" } } }
{ "_id" : ObjectId("5e368b159e4f06af551997d0"), "details" : { "UserName" : "David", "UserAge" : 21, "PhoneDetails" : { "PhoneNumber" : "87664534654" } } }현재 상태에서는 전체 문서가 반환되기 때문에, 필요 없는 필드까지 함께 출력됩니다.
3. distinct()로 전화번호만 배열로 반환하기
특정 필드의 값만 배열 형태로 얻으려면 distinct() 메서드에 필드 경로를 지정하면 됩니다. 중첩된 필드는 점(.) 표기법으로 접근합니다.
> db.demo166.distinct("details.PhoneDetails.PhoneNumber");실행 결과는 다음과 같습니다.
[ "98646463533", "87664534654" ]
핵심 정리
distinct() 메서드는 지정한 필드의 고유한 값들을 배열로 반환합니다. 중첩된 하위 필드도 점 표기법(details.PhoneDetails.PhoneNumber)으로 경로를 지정할 수 있어, 복잡한 문서 구조에서도 원하는 값만 손쉽게 추출할 수 있습니다. 참고로 동일한 값이 여러 문서에 존재하는 경우 중복이 제거된 결과가 반환되므로, 단순히 값 목록만 필요할 때 매우 유용한 방법입니다.