별개
정의
distinct
단일 컬렉션에서 지정된 필드의 고유 값을 찾습니다.
distinct
는 고유 값의 배열이 내장된 문서를 반환합니다. 반환 문서에는 쿼리 통계 및 쿼리 계획이 내장된 문서도 포함되어 있습니다.팁
mongosh
에서 이 명령은db.collection.distinct()
헬퍼 메서드를 통해서도 실행 수 있습니다.헬퍼 메서드는
mongosh
사용자에게 편리하지만 데이터베이스 명령과 동일한 수준의 정보를 반환하지 못할 수 있습니다. 편의가 필요하지 않거나 추가 리턴 필드가 필요한 경우 데이터베이스 명령을 사용합니다.
호환성
이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
중요
이 명령은 M0, M2 및 M5 클러스터에서 제한적으로 지원 됩니다. 자세한 내용은 지원되지 않는 명령을 참조하세요.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
명령은 다음과 같은 구문을 가집니다:
db.runCommand( { distinct: "<collection>", key: "<field>", query: <query>, readConcern: <read concern document>, collation: <collation document>, comment: <any>, hint: <string or document> } )
명령 필드
이 명령은 다음 필드를 사용합니다.
필드 | 유형 | 설명 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
distinct | 문자열 | 고유 값을 쿼리할 컬렉션의 이름입니다. | ||||||||||
key | 문자열 | 고유값을 반환할 필드입니다. | ||||||||||
query | 문서 | 선택 사항입니다. 고유 값을 검색할 문서를 지정하는 쿼리입니다. | ||||||||||
readConcern | 문서 | 선택 사항. 읽기 고려를 지정합니다.
가능한 읽기 고려 수준은 다음과 같습니다.
읽기 고려 수준에 대한 자세한 내용은 읽기 고려 수준을 참조하세요. | ||||||||||
collation | 문서 | 선택 사항. 작업에 사용할 데이터 정렬을 지정합니다. 데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. 데이터 정렬 옵션의 구문은 다음과 같습니다:
데이터 정렬을 지정할 때 데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( 컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다. 한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다. | ||||||||||
comment | any | 선택 사항. 이 명령에 첨부할 사용자 제공 코멘트입니다. 설정되면 이 설명은 다음 위치에서 이 명령의 레코드와 함께 표시됩니다.
댓글은 유효한 모든 BSON types (문자열, 정수, 객체, 배열 등)이 될 수 있습니다. | ||||||||||
hint | 문자열 또는 문서 | 선택 사항. 인덱스 이름을 string 또는 문서 로 지정합니다. 지정된 경우 쿼리 플래너는 힌트 인덱스 를 사용하는 계획만 고려합니다. 자세한 내용 은 인덱스 지정을 참조하세요. 버전 7.1에 새로 추가되었습니다. |
참고
결과는 최대 BSON 크기보다 크지 않아야 합니다. 결과가 최대 BSON 크기를 초과하는 경우 집계 파이프라인을 사용하여 고유값 조회에 설명된 대로 집계 파이프라인을 사용하여 $group
연산자로 고유값을 검색합니다.
MongoDB는 distinct
명령에 대한 db.collection.distinct()
shell 래퍼(wrapper) 메서드도 제공합니다. 또한 많은 MongoDB 드라이버는 래퍼(wrapper) 메서드를 제공합니다. 특정 드라이버 설명서를 참조하세요.
행동
샤딩된 클러스터에서 distinct
명령은 고아 문서를 반환할 수 있습니다.
Time Series 컬렉션의 경우 distinct
명령은 인덱스를 효율적으로 활용할 수 없습니다. 대신 $group
집계를 사용하여 고유한 값으로 문서를 그룹화하세요. 자세한 내용은 Time Series 제한 사항을 참조하세요.
필드 배열
지정된 field
의 값이 배열인 경우 distinct
(은)는 배열의 각 요소를 별도의 값으로 간주합니다.
예를 들어 필드에 [ 1, [1], 1 ]
값이 있는 경우 distinct
는 1
, [1]
, 1
을 별도의 값으로 간주합니다.
MongoDB 6.0부터 distinct
명령은 배열을 사용할 때 컬렉션과 뷰에 동일한 결과를 반환합니다.
예를 들면 다음과 같습니다.
인덱스 사용하기
가능한 경우 distinct
작업은 인덱스를 사용할 수 있습니다.
인덱스는 distinct
작업도 처리 할 수 있습니다. 인덱스가 처리하는 쿼리에 대한 자세한 내용은 처리된 쿼리를 참조하세요.
트랜잭션
트랜잭션 내에서 고유한 작업을 수행합니다.
샤드되지 않은 컬렉션의 경우,
db.collection.distinct()
메서드/distinct
명령과$group
단계의 집계 파이프라인을 사용할 수 있습니다.샤딩된 컬렉션의 경우
db.collection.distinct()
메서드 또는distinct
명령을 사용할 수 없습니다.샤드 컬렉션의 고유값을 찾으려면 대신
$group
단계의 집계 파이프라인을 사용합니다. 자세한 내용은 고유 작업을 참조하세요.
중요
대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.
추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.
클라이언트 연결 해제
MongoDB 4.2부터 distinct
를 발급한 클라이언트가 작업이 완료되기 전에 연결을 끊는 경우, MongoDB는 distinct
를 사용하여 를killOp
을 종료로 표시합니다.
복제본 세트 구성원 국가 제한
복제본 세트 노드에서 실행하는 경우 distinct
작업을 수행하려면 해당 노드가 PRIMARY
또는 SECONDARY
상태에 있어야 합니다. 노드가 STARTUP2
와 같은 다른 상태에 있으면 작업 오류가 발생합니다.
인덱스 필터 및 데이터 정렬
MongoDB 6.0부터 인덱스 필터는 이전에 명령을 planCacheSetFilter
사용하여 설정한 데이터 정렬을 사용합니다.
MongoDB 8.0 부터는 인덱스 필터 를 추가하는 대신 쿼리 설정을 사용합니다. 인덱스 필터는 MongoDB 8.0 부터 더 이상 사용되지 않습니다.
쿼리 설정에는 인덱스 필터보다 더 많은 기능이 있습니다. 또한 인덱스 필터는 영구적이지 않으며 모든 클러스터 노드에 대한 인덱스 필터를 쉽게 만들 수 없습니다. 쿼리 설정을 추가하고 예제를 탐색하려면 setQuerySettings
를 참조하세요.
쿼리 설정
버전 8.0에 추가 되었습니다.
쿼리 설정을 사용하여 인덱스 힌트를 설정하고, 작업 거부 필터 및 기타 필드를 설정할 수 있습니다. 해당 설정은 전체 클러스터의 쿼리 형태에 적용됩니다. 클러스터는 종료 후에도 설정을 유지합니다.
쿼리 옵티마이저는 쿼리 계획 중 추가 입력으로 쿼리 설정을 사용하여 쿼리를 실행할 계획에 영향을 미칩니다. 쿼리 설정을 사용하여 쿼리 형태를 차단할 수도 있습니다.
쿼리 설정을 추가하고 예시를 살펴보려면 setQuerySettings
를 참조하세요.
find
, distinct
및 aggregate
명령에 대한 쿼리 설정을 추가할 수 있습니다.
쿼리 설정은 더 많은 기능을 제공하며 더 이상 사용되지 않는 인덱스 필터보다 선호됩니다.
쿼리 설정을 제거 하려면 removeQuerySettings
를 사용합니다. 쿼리 설정을 가져오려면 집계 파이프라인 에서 $querySettings
단계를 사용합니다.
예시
이 예시에서는 다음 문서가 포함된 inventory
collection을 사용합니다.
{ "_id": 1, "dept": "A", "item": { "sku": "111", "color": "red" }, "sizes": [ "S", "M" ] } { "_id": 2, "dept": "A", "item": { "sku": "111", "color": "blue" }, "sizes": [ "M", "L" ] } { "_id": 3, "dept": "B", "item": { "sku": "222", "color": "blue" }, "sizes": "S" } { "_id": 4, "dept": "A", "item": { "sku": "333", "color": "black" }, "sizes": [ "S" ] }
필드에 대한 고유 값 반환
다음 예시에서는 inventory
컬렉션의 모든 문서에서 dept
필드에 대한 고유 값을 반환합니다.
db.runCommand ( { distinct: "inventory", key: "dept" } )
이 명령어는 고유한 dept
값이 포함된 values
이라는 필드가 있는 문서를 반환합니다.
{ "values" : [ "A", "B" ], "ok" : 1 }
포함된 필드에 대한 고유 값 반환
다음 예시에서는 inventory
collection의 모든 문서에서 item
필드에 포함된 sku
필드의 고유 값을 반환합니다.
db.runCommand ( { distinct: "inventory", key: "item.sku" } )
이 명령어는 고유한 sku
값이 포함된 values
이라는 필드가 있는 문서를 반환합니다.
{ "values" : [ "111", "222", "333" ], "ok" : 1 }
배열 필드에 대한 고유 값 반환
다음 예시에서는 inventory
컬렉션의 모든 문서에서 sizes
필드에 대한 고유 값을 반환합니다.
db.runCommand ( { distinct: "inventory", key: "sizes" } )
이 명령어는 고유한 sizes
값이 포함된 values
이라는 필드가 있는 문서를 반환합니다.
{ "values" : [ "M", "S", "L" ], "ok" : 1 }
컬렉션과 뷰 내 배열
MongoDB 6.0부터 distinct
명령은 배열을 사용할 때 컬렉션과 뷰에 동일한 결과를 반환합니다.
다음 예에서는 각 문서의 온도 값 배열을 사용하여 이름이 sensor
인 컬렉션을 만듭니다.
db.sensor.insertMany( [ { _id: 0, temperatures: [ { value: 1 }, { value: 4 } ] }, { _id: 1, temperatures: [ { value: 2 }, { value: 8 } ] }, { _id: 2, temperatures: [ { value: 3 }, { value: 12 } ] }, { _id: 3, temperatures: [ { value: 1 }, { value: 4 } ] } ] )
다음 예시에서는 sensor
컬렉션에서 sensorView
라는 이름의 뷰를 만듭니다.
db.createView( "sensorView", "sensor", [] )
다음 예시에서는 distinct
를 사용하여 sensor
컬렉션의 temperatures
배열에서 고유 값을 반환합니다.
db.sensor.distinct( "temperatures.1.value" )
temperatures.1.value
내의 1
은 temperatures
배열 인덱스를 지정합니다.
출력 예시:
[ 4, 8, 12 ]
sensorView
예시
db.sensorView.distinct( "temperatures.1.value" )
출력 예시:
[ 4, 8, 12 ]
이는 MongoDB 6.0부터 시작합니다(sensor
컬렉션에서 반환 된 결과와 동일).[]
버전 6.0 이전의 MongoDB.
(으)로 쿼리 지정하기 distinct
다음 예시에서는 dept
가 "A"
인 문서에서 item
필드에 포함된 sku
필드의 고유 값을 반환합니다.
db.runCommand ( { distinct: "inventory", key: "item.sku", query: { dept: "A"} } )
이 명령어는 고유한 sku
값이 포함된 values
이라는 필드가 있는 문서를 반환합니다.
{ "values" : [ "111", "333" ], "ok" : 1 }
데이터 정렬 지정
데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.
컬렉션 myColl
에는 다음 문서가 있습니다.
{ _id: 1, category: "café", status: "A" } { _id: 2, category: "cafe", status: "a" } { _id: 3, category: "cafE", status: "a" }
다음 집계 작업에는 데이터 정렬 옵션이 포함됩니다.
db.runCommand( { distinct: "myColl", key: "category", collation: { locale: "fr", strength: 1 } } )
필드에 대한 설명은 데이터 정렬 문서를 참조하세요.
기본 읽기 고려 재정의
기본 읽기 문제 수준인 "local"
를 재정의하려면 readConcern
옵션을 사용하십시오.
복제본 세트에 대한 다음 작업은 대부분의 노드에 기록된 것으로 확인된 데이터의 가장 최근 복제본을 읽을 수 있도록 "majority"
의 읽기 고려를 지정합니다.
참고
읽기 고려 수준에 관계없이 노드의 최신 데이터는 시스템에 있는 데이터의 최신 버전을 반영하지 않을 수 있습니다.
db.runCommand( { distinct: "restaurants", key: "rating", query: { cuisine: "italian" }, readConcern: { level: "majority" } } )
단일 스레드가 자신의 쓰기를 읽을 수 있도록 하려면 복제본 세트의 프라이머리에 대해 "majority"
읽기 고려 및 "majority"
쓰기 고려를 사용합니다.
인덱스 지정
힌트 옵션을 사용하여 인덱스 이름이나 패턴을 지정할 수 있습니다.
인덱스 이름을 기반으로 힌트를 지정하려면 다음을 수행합니다.
db.runCommand ( { distinct: "inventory", key: "dept", hint: "sizes" } )
인덱스 패턴을 기반으로 힌트를 지정하려면 다음을 수행합니다.
db.runCommand ( { distinct: "inventory", key: "dept", hint: { sizes: 1 } } )