데이터 정렬
이 페이지의 내용
버전 3.4에 새로 추가되었습니다.
데이터 정렬을 이용하여 문자열 비교를 위한 언어별 규칙(예: 대소문자 및 악센트 표기 규칙)을 지정할 수 있습니다.
컬렉션이나 뷰, 인덱스 또는 데이터 정렬을 지원하는 특정 작업에 데이터 정렬을 지정할 수 있습니다.
MongoDB Atlas UI에서 문서를 쿼리할 때 데이터 정렬을 지정하려면 데이터 정렬 지정을 참조하세요.
데이터 대조 문서
데이터 정렬 문서에는 다음과 같은 필드가 있습니다.
{ locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> }
데이터 정렬을 지정할 때 locale
필드는 필수이고, 다른 데이터 정렬 필드는 모두 선택 사항입니다. 필드에 대한 설명은 데이터 정렬 문서를 참조하세요.
기본 데이터 정렬 매개변수 값은 지정하는 국가 및 언어 설정에 따라 달라집니다. 기본 데이터 정렬 매개변수와 해당 매개변수와 연결된 국가 및 언어 설정 목록은 데이터 정렬 기본 매개변수를 참조하세요.
필드 | 유형 | 설명 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 문자열 | ICU 국가 및 언어 설정. 지원되는 국가 및 언어 설정 목록은 지원되는 국가 및 언어 설정을 참조하십시오. 단순 이진 비교를 지정하려면 | ||||||||||||
| integer | 선택 사항입니다. 수행할 비교 수준입니다. ICU 비교 수준에 해당합니다. 가능한 값은 다음과 같습니다.
자세한 내용은 ICU 데이터 정렬: 비교 수준 항목을 참조하세요. | ||||||||||||
| 부울 | 선택 사항입니다.
자세한 내용은 ICU 데이터 정렬: 사례 수준을 참조하십시오. | ||||||||||||
| 문자열 | 선택 사항. 3차 수준 비교 시 대소문자 차이의 정렬 순서를 결정하는 필드입니다. 가능한 값은 다음과 같습니다.
| ||||||||||||
| 부울 | 선택 사항. 숫자 문자열을 숫자로 비교할지, 아니면 문자열로 비교할지를 결정하는 플래그입니다.
기본값은 | ||||||||||||
| 문자열 | 선택 사항. 비교를 위해 데이터 정렬에서 공백과 문장 부호를 기본 문자로 고려할지 여부를 결정하는 필드입니다. 가능한 값은 다음과 같습니다.
자세한 내용은 ICU 데이터 정렬: 비교 수준 항목을 참조하세요. 기본값은 | ||||||||||||
| 문자열 | 선택 사항. 가능한 값은 다음과 같습니다.
| ||||||||||||
| 부울 | 선택 사항. 일부 프랑스어 사전 순서와 같이 분음 부호가 있는 문자열을 문자열 뒤쪽부터 정렬할지 여부를 결정하는 플래그입니다.
기본값은 | ||||||||||||
| 부울 | 선택 사항. 텍스트에 정규화가 필요한지 확인하고 정규화를 수행할지 여부를 결정하는 플래그입니다. 일반적으로 대부분의 텍스트에는 이러한 정규화 처리가 필요하지 않습니다.
기본값은 자세한 내용은 https://unicode-org.github.io/icu/userguide/collation/concepts.html#normalization을 참조하세요. |
데이터 정렬을 지원하는 작업
다음 작업에 대해 데이터 정렬을 지정할 수 있습니다.
참고
한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다.
명령. | mongosh 방법 |
---|---|
| |
|
[1] | (1, 2) 일부 인덱스 유형은 데이터 정렬을 지원하지 않습니다. 자세한 내용은 데이터 정렬 및 지원되지 않는 인덱스 유형을 참조하세요. |
행동
로컬 변형
일부 데이터 정렬 국가 및 언어 설정에는 특수한 언어별 규칙을 사용하는 변형이 있습니다. 국가 및 언어 설정 변형을 지정하려면 다음 구문을 사용하세요.
{ "locale" : "<locale code>@collation=<variant>" }
예를 들어 중국어 데이터 정렬의 unihan
변형을 사용하려면 다음을 사용하세요.
{ "locale" : "zh@collation=unihan" }
모든 데이터 정렬 국가 및 언어 설정과 그 변형에 대한 전체 목록은 데이터 정렬 국가 및 언어 설정을 참조하세요.
데이터 정렬 및 뷰
뷰를 만들 때 뷰의 기본 데이터 정렬을 지정할 수 있습니다. 데이터 정렬이 지정되지 않은 경우, 뷰의 기본 데이터 정렬은 "simple" 이진 비교 데이터 정렬기입니다. 즉, 뷰는 컬렉션의 기본 데이터 정렬을 상속하지 않습니다.
뷰의 문자열 비교에서는 뷰의 기본 데이터 정렬을 사용합니다. 뷰의 기본 데이터 정렬을 변경하거나 재정의하려는 작업은 오류를 반환하며 실패합니다.
다른 보기에서 보기를 만드는 경우 원본 보기의 데이터 정렬과 다른 데이터 정렬을 지정할 수 없습니다.
$lookup
또는$graphLookup
과 같이 여러 뷰를 포함하는 집계를 수행하는 경우 뷰의 데이터 정렬이 동일해야 합니다.
데이터 정렬 및 인덱스 사용
문자열 비교에 인덱스를 사용하려면 작업에서 동일한 데이터 정렬도 지정해야 합니다. 즉, 작업에서 다른 데이터 정렬을 지정하는 경우 데이터 정렬이 있는 인덱스는 인덱싱된 필드에서 문자열 비교를 수행하는 작업을 지원할 수 없습니다.
경고
데이터 정렬로 구성된 인덱스는 ICU 데이터 정렬 키를 사용하여 정렬 순서를 지정하므로, 데이터 정렬이 없는 인덱스의 경우 데이터 정렬 인식 인덱스 키가 인덱스 키보다 클 수 있습니다.
예를 들어, 컬렉션 myColl
에는 대조 국가 및 언어 설정이 "fr"
인 문자열 필드 category
에 대한 색인이 있습니다.
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
인덱스와 동일한 데이터 정렬을 지정하는 다음 쿼리 작업에서는 인덱스를 사용할 수 있습니다.
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
하지만 기본적으로 '단순' 바이너리 데이터 정렬기를 사용하는 다음 쿼리 작업에서는 인덱스를 사용할 수 없습니다.
db.myColl.find( { category: "cafe" } )
인덱스 접두사 키가 문자열, 배열 및 내장된 문서가 아닌 복합 인덱스의 경우, 다른 데이터 정렬을 지정하는 작업에서도 인덱스를 사용하여 인덱스 접두사 키에 대한 비교를 지원할 수 있습니다.
예를 들어, 컬렉션 myColl
에는 숫자 필드 score
및 price
와 문자열 필드 category
에 복합 인덱스가 있습니다. 인덱스는 문자열 비교를 위해 데이터 정렬 국가 및 언어 설정 "fr"
을 사용하여 만들어집니다.
db.myColl.createIndex( { score: 1, price: 1, category: 1 }, { collation: { locale: "fr" } } )
문자열 비교에 "simple"
이진 데이터 정렬을 사용하는 다음 작업에서는 인덱스를 사용할 수 있습니다.
db.myColl.find( { score: 5 } ).sort( { price: 1 } ) db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
색인이 생성된 category
필드의 문자열 비교를 위해 "simple"
이진 데이터 정렬을 사용하는 다음 작업은 색인을 사용하여 쿼리의 score: 5
부분만 수행할 수 있습니다.
db.myColl.find( { score: 5, category: "cafe" } )
중요
내장된 문서 키를 비롯한 문서 키와의 일치는 단순 이진 비교를 사용합니다. 즉, "foo.bár"와 같은 키에 대한 쿼리는 "foo.bar" 키와 일치하지 않습니다. 이는 강도 매개변수에 설정한 값에 관계없이 적용됩니다.
데이터 정렬 및 지원되지 않는 인덱스 유형
다음 인덱스는 단순 바이너리 비교만 지원하며 데이터 정렬은 지원하지 않습니다.
텍스트 인덱스,
2D 인덱스 및
geoHaystack 인덱스.
팁
단순 데이터 정렬이 아닌 collection에 text
, 2d
또는 geoHaystack
인덱스를 만들려면 인덱스를 만들 때 {collation: {locale: "simple"} }
을 명시적으로 지정해야 합니다.
제한 사항
numericOrdering
numericOrdering
을 true
로 지정하면 다음과 같은 제한 사항이 적용됩니다.
비교에서는 연속된 음수가 아닌 정수 부분 문자열만 고려됩니다.
numericOrdering
다음은 지원하지 않습니다.+
-
소수점 및 소수 쉼표와 같은 소수점 구분 기호
지수
숫자 또는 십진수(Nd) 범주의 유니코드 코드 포인트만 숫자로 처리됩니다.
숫자 길이가 254자를 초과하는 경우 초과 문자는 별도의 숫자로 처리됩니다.
다음과 같은 문자열 번호와 십진수 값을 가진 컬렉션을 고해 보겠습니다.
db.c.insertMany( [ { "n" : "1" }, { "n" : "2" }, { "n" : "2.1" }, { "n" : "-2.1" }, { "n" : "2.2" }, { "n" : "2.10" }, { "n" : "2.20" }, { "n" : "-10" }, { "n" : "10" }, { "n" : "20" }, { "n" : "20.1" } ] )
다음 find
쿼리는 numericOrdering
매개변수가 포함된 데이터 정렬 문서를 사용합니다.
db.c.find( { }, { _id: 0 } ).sort( { n: 1 } ).collation( { locale: 'en_US', numericOrdering: true } )
이 연산은 다음과 같은 결과를 반환합니다.
[ { n: '-2.1' }, { n: '-10' }, { n: '1' }, { n: '2' }, { n: '2.1' }, { n: '2.2' }, { n: '2.10' }, { n: '2.20' }, { n: '10' }, { n: '20' }, { n: '20.1' } ]
numericOrdering: true
문자열 값을 숫자 값인 것처럼 오름차순으로 정렬합니다.두 개의 음수 값
-2.1
및-10
은 지원되지 않는-
문자가 있기 때문에 예상된 정렬 순서로 정렬되지 않습니다.numericOrdering
매개변수가 소수 값을 지원하지 않기 때문에2.2
값은2.10
값보다 먼저 정렬됩니다.결과적으로
2.2
및2.10
은 사전 순으로 정렬됩니다.