Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

별개

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 명령 필드
  • 행동
  • 예시
distinct

단일 컬렉션에서 지정된 필드의 고유 값을 찾습니다. distinct는 고유 값의 배열이 내장된 문서를 반환합니다. 반환 문서에는 쿼리 통계 및 쿼리 계획이 내장된 문서도 포함되어 있습니다.

mongosh 에서 이 명령은 db.collection.distinct() 헬퍼 메서드를 통해서도 실행 수 있습니다.

헬퍼 메서드는 mongosh 사용자에게 편리하지만 데이터베이스 명령과 동일한 수준의 정보를 반환하지 못할 수 있습니다. 편의가 필요하지 않거나 추가 리턴 필드가 필요한 경우 데이터베이스 명령을 사용합니다.

이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

중요

이 명령은 M0, M2 및 M5 클러스터에서 제한적으로 지원 됩니다. 자세한 내용은 지원되지 않는 명령을 참조하세요.

명령은 다음과 같은 구문을 가집니다:

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
문서

선택 사항. 읽기 고려를 지정합니다.

readConcern 옵션의 구문은 다음과 같습니다. readConcern: { level: <value> }

가능한 읽기 고려 수준은 다음과 같습니다.

  • "local"이는 프라이머리 및 보조 노드에 대한 읽기 작업의 읽기 고려 수준입니다.

  • "available"입니다. 프라이머리 및 세컨더리에 대한 읽기 작업에 사용할 수 있습니다. "available"은 프라이머리 및 비 샤드형 세컨더리에 대해 "local"과 동일하게 동작합니다. 쿼리는 인스턴스의 가장 최근 데이터를 반환합니다.

  • "majority". WiredTiger 스토리지 엔진을 사용하는 복제본 세트에 사용할 수 있습니다.

  • "linearizable". primary의 읽기 작업에만 사용할 수 있습니다.

읽기 고려 수준에 대한 자세한 내용은 읽기 고려 수준을 참조하세요.

collation
문서

선택 사항.

작업에 사용할 데이터 정렬을 지정합니다.

데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.

데이터 정렬 옵션의 구문은 다음과 같습니다:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

데이터 정렬을 지정할 때 locale 필드는 필수이고, 다른 데이터 정렬 필드는 모두 선택 사항입니다. 필드에 대한 설명은 데이터 정렬 문서를 참조하세요.

데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( db.createCollection() 참조), 작업은 컬렉션에 지정된 데이터 정렬을 사용합니다.

컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, 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 ] 값이 있는 경우 distinct1, [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, distinctaggregate 명령에 대한 쿼리 설정을 추가할 수 있습니다.

쿼리 설정은 더 많은 기능을 제공하며 더 이상 사용되지 않는 인덱스 필터보다 선호됩니다.

쿼리 설정을 제거 하려면 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
}

distinct 및 배열 필드에 대한 자세한 내용은 동작 섹션을 참조하세요.

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 내의 1temperatures 배열 인덱스를 지정합니다.

출력 예시:

[ 4, 8, 12 ]

sensorView 예시

db.sensorView.distinct( "temperatures.1.value" )

출력 예시:

  • [ 4, 8, 12 ] 이는 MongoDB 6.0부터 시작합니다(sensor 컬렉션에서 반환 된 결과와 동일).

  • [] 버전 6.0 이전의 MongoDB.

다음 예시에서는 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 } } )

돌아가기

카운트