MongoDB에서 특정 필드의 중복된 값을 제거하고 고유한(unique) 레코드만 조회하려면 distinct() 메서드를 사용하면 됩니다. 이 메서드는 지정한 필드에서 중복을 제거한 값들을 배열 형태로 반환해 줍니다.
1. 샘플 데이터 생성하기
먼저 테스트용 컬렉션을 생성하고 문서를 삽입해 보겠습니다. 의도적으로 동일한 이름이 중복되도록 데이터를 구성했습니다.
> db.demo613.insertOne({"Name":"Chris"});
{
"acknowledged" : true, "insertedId" : ObjectId("5e988bd4f6b89257f5584d88")
}
> db.demo613.insertOne({"Name":"Bob"});
{
"acknowledged" : true, "insertedId" : ObjectId("5e988bdbf6b89257f5584d89")
}
> db.demo613.insertOne({"Name":"Bob"});
{
"acknowledged" : true, "insertedId" : ObjectId("5e988bddf6b89257f5584d8a")
}
> db.demo613.insertOne({"Name":"David"});
{
"acknowledged" : true, "insertedId" : ObjectId("5e988be0f6b89257f5584d8b")
}
> db.demo613.insertOne({"Name":"Chris"});
{
"acknowledged" : true, "insertedId" : ObjectId("5e988be2f6b89257f5584d8c")
}
> db.demo613.insertOne({"Name":"Sam"});
{
"acknowledged" : true, "insertedId" : ObjectId("5e988be8f6b89257f5584d8d")
}
2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo613.find();
실행 결과는 다음과 같습니다. 'Bob'과 'Chris'가 각각 두 번씩 저장되어 있는 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e988bd4f6b89257f5584d88"), "Name" : "Chris" }
{ "_id" : ObjectId("5e988bdbf6b89257f5584d89"), "Name" : "Bob" }
{ "_id" : ObjectId("5e988bddf6b89257f5584d8a"), "Name" : "Bob" }
{ "_id" : ObjectId("5e988be0f6b89257f5584d8b"), "Name" : "David" }
{ "_id" : ObjectId("5e988be2f6b89257f5584d8c"), "Name" : "Chris" }
{ "_id" : ObjectId("5e988be8f6b89257f5584d8d"), "Name" : "Sam" }
3. distinct()로 고유한 값만 조회하기
다음은 Name 필드의 고유한 값만 추출하는 쿼리입니다.
> db.demo613.distinct("Name");
실행 결과는 다음과 같습니다. 중복이 제거된 네 가지 이름만 배열로 반환됩니다.
[ "Chris", "Bob", "David", "Sam" ]
추가 팁: 조건과 함께 사용하기
distinct() 메서드는 두 번째 인자로 쿼리 조건을 전달할 수도 있습니다. 예를 들어 db.demo613.distinct("Name", { "Name": { $ne: "Sam" } })처럼 작성하면 특정 조건을 만족하는 문서들에서만 고유한 값을 추출할 수 있습니다. 또한 결과가 배열로 반환되기 때문에 애플리케이션 코드에서 바로 활용하기에도 매우 편리합니다.