SQL의 SELECT DISTINCT 문과 동일한 결과를 얻고 싶다면, MongoDB에서는 distinct() 메서드를 사용하면 됩니다. 이 메서드는 특정 필드의 고유한 값들만 추출해 주며, 조건(쿼리 필터)을 함께 지정할 수도 있습니다.
1. 테스트용 컬렉션 생성
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"John","Age":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd12759e3526dbddbbfb60b")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd12768e3526dbddbbfb60c")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"David","Age":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd12773e3526dbddbbfb60d")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd1277ee3526dbddbbfb60e")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Sam","Age":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd12793e3526dbddbbfb60f")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd127a3e3526dbddbbfb610")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd127aae3526dbddbbfb611")
}2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.distinctNameAndAgeDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd12759e3526dbddbbfb60b"),
"ClientFirstName" : "John",
"Age" : 23
}
{
"_id" : ObjectId("5cd12768e3526dbddbbfb60c"),
"ClientFirstName" : "Larry",
"Age" : 25
}
{
"_id" : ObjectId("5cd12773e3526dbddbbfb60d"),
"ClientFirstName" : "David",
"Age" : 25
}
{
"_id" : ObjectId("5cd1277ee3526dbddbbfb60e"),
"ClientFirstName" : "Carol",
"Age" : 26
}
{
"_id" : ObjectId("5cd12793e3526dbddbbfb60f"),
"ClientFirstName" : "Sam",
"Age" : 25
}
{
"_id" : ObjectId("5cd127a3e3526dbddbbfb610"),
"ClientFirstName" : "Larry",
"Age" : 25
}
{
"_id" : ObjectId("5cd127aae3526dbddbbfb611"),
"ClientFirstName" : "Carol",
"Age" : 26
}출력 결과를 보면 나이가 25세인 고객이 Larry, David, Sam, Larry로 총 4명이며, 그중 Larry는 중복되어 있습니다.
3. DISTINCT에 해당하는 distinct() 쿼리 실행
SQL의 SELECT DISTINCT(name) FROM collectionName WHERE age = "25"와 동일한 역할을 하는 MongoDB 쿼리는 다음과 같습니다.
> db.distinctNameAndAgeDemo.distinct("ClientFirstName", {"Age": 25});실행 결과는 아래와 같습니다.
[ "Larry", "David", "Sam" ]
결과 정리
distinct() 메서드의 첫 번째 인수에는 고유값을 구하고자 하는 필드명(ClientFirstName)을, 두 번째 인수에는 필터 조건({"Age": 25})을 전달합니다. 그 결과 나이가 25세인 고객들의 이름에서 중복이 제거된 값만 배열 형태로 반환됩니다.
이처럼 MongoDB에서는 SQL의 DISTINCT + WHERE 조합을 별도의 집계 파이프라인 없이도 distinct() 메서드 하나로 간단하게 처리할 수 있습니다.