Docs Menu
Docs Home
/
MongoDB 매뉴얼
/

데이터 정렬

이 페이지의 내용

  • 데이터 대조 문서
  • 데이터 정렬을 지원하는 작업
  • 행동
  • 제한 사항

버전 3.4에 새로 추가되었습니다.

데이터 정렬을 이용하여 문자열 비교를 위한 언어별 규칙(예: 대소문자 및 악센트 표기 규칙)을 지정할 수 있습니다.

컬렉션이나 뷰, 인덱스 또는 데이터 정렬을 지원하는 특정 작업에 데이터 정렬을 지정할 수 있습니다.

MongoDB Atlas UI에서 문서를 쿼리할 때 데이터 정렬을 지정하려면 데이터 정렬 지정을 참조하세요.

데이터 정렬 문서에는 다음과 같은 필드가 있습니다.

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

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

기본 데이터 정렬 매개변수 값은 지정하는 국가 및 언어 설정에 따라 달라집니다. 기본 데이터 정렬 매개변수와 해당 매개변수와 연결된 국가 및 언어 설정 목록은 데이터 정렬 기본 매개변수를 참조하세요.

필드
유형
설명

locale

문자열

ICU 국가 및 언어 설정. 지원되는 국가 및 언어 설정 목록은 지원되는 국가 및 언어 설정을 참조하십시오.

단순 이진 비교를 지정하려면 "simple"locale 값을 지정합니다.

strength

integer

선택 사항입니다. 수행할 비교 수준입니다. ICU 비교 수준에 해당합니다. 가능한 값은 다음과 같습니다.

설명

1

1차 비교 수준. 데이터 정렬은 분음 부호 및 대소문자와 같은 다른 차이점을 무시하고 기본 문자만 비교합니다.

2

세컨더리 비교 수준. 데이터 정렬은 분음 부호와 같은 이차적인 차이까지 비교를 수행합니다. 즉, 데이터 정렬은 기본 문자(1차 차이)와 분음 부호(2차 차이)의 비교를 수행합니다. 기본 문자 간의 차이는 분음 부호 간의 차이보다 우선합니다.

3

3차 비교 수준. 대조는 대소문자 및 문자 변형과 같은 3차 차이까지 비교를 수행합니다. 즉, 데이터 정렬은 프라이머리 문자 (주요 차이점), 분음 부호 (2차 차이), 대소문자 및 변형 (3차 차이) 을 비교합니다. 기본 문자 간의 차이는 2차 차이보다 우선하며, 2차 차이는 3차 차이보다 우선합니다.

이것이 기본 수준입니다.

4

4차 수준. 1-3차 수준에서 구두점을 무시하거나 일본어 텍스트를 처리하는 경우 구두점을 고려하도록 특정 사용 사례로 제한됩니다.

5

동일한 수준. 타이 브레이커 (tie breaker)의 특정 사용 사례에는 제한이 있습니다.

자세한 내용은 ICU 데이터 정렬: 비교 수준 항목을 참조하세요.

caseLevel

부울

선택 사항입니다. strength 수준 1 또는 2에서 대/소문자 비교를 포함할지 여부를 결정하는 플래그입니다.

true이면 대소문자 비교를 포함합니다.

  • strength:1와 함께 사용하면 데이터 정렬은 기본 문자와 대/소문자를 비교합니다.

  • strength:2와 함께 사용하면 데이터 정렬은 기본 문자, 분음 부호(및 기타 가능한 2차 차이) 및 대/소문자를 비교합니다.

false인 경우 1 또는 2 수준에서 대소문자 비교를 포함하지 마세요. 기본값은 false입니다.

자세한 내용은 ICU 데이터 정렬: 사례 수준을 참조하십시오.

caseFirst

문자열

선택 사항. 3차 수준 비교 시 대소문자 차이의 정렬 순서를 결정하는 필드입니다.

가능한 값은 다음과 같습니다.

설명

"upper"

대문자가 소문자보다 먼저 정렬됩니다.

"lower"

소문자가 대문자보다 먼저 정렬됩니다.

"off"

기본값입니다. "lower"와 비슷하지만 약간의 차이가 있습니다. 차이점에 대한 자세한 내용은 https://unicode-org.github.io/icu/userguide/strings/properties.html#customization을 참조하세요.

numericOrdering

부울

선택 사항. 숫자 문자열을 숫자로 비교할지, 아니면 문자열로 비교할지를 결정하는 플래그입니다.

true이면 숫자로 비교합니다. 예를 들어 "10""2"보다 큽니다.

false인 경우 문자열로 비교합니다. 예를 들어 "10""2"보다 작습니다.

기본값은 false입니다.

numericOrdering 제한 사항을 참조하세요.

alternate

문자열

선택 사항. 비교를 위해 데이터 정렬에서 공백과 문장 부호를 기본 문자로 고려할지 여부를 결정하는 필드입니다.

가능한 값은 다음과 같습니다.

설명

"non-ignorable"

공백과 문장 부호는 기본 문자로 간주됩니다.

"shifted"

공백과 구두점은 기본 문자로 간주되지 않으며 강도 수준이 3보다 큰 경우에만 구별됩니다.

자세한 내용은 ICU 데이터 정렬: 비교 수준 항목을 참조하세요.

기본값은 "non-ignorable"입니다.

maxVariable

문자열

선택 사항. alternate: "shifted"일 때 무시할 수 있는 문자로 간주되는 문자를 결정하는 필드입니다. alternate: "non-ignorable"인 경우 영향을 미치지 않습니다.

가능한 값은 다음과 같습니다.

설명

"punct"

공백과 구두점은 모두 무시할 수 있으며 기본 문자로 간주되지 않습니다.

"space"

공백은 무시할 수 있으며 기본 문자로 간주되지 않습니다.

backwards

부울

선택 사항. 일부 프랑스어 사전 순서와 같이 분음 부호가 있는 문자열을 문자열 뒤쪽부터 정렬할지 여부를 결정하는 플래그입니다.

true이면 뒤쪽에서 앞쪽으로 비교합니다.

false이면 앞쪽에서 뒤쪽으로 비교합니다.

기본값은 false입니다.

normalization

부울

선택 사항. 텍스트에 정규화가 필요한지 확인하고 정규화를 수행할지 여부를 결정하는 플래그입니다. 일반적으로 대부분의 텍스트에는 이러한 정규화 처리가 필요하지 않습니다.

true인 경우 완전히 정규화되었는지 확인하고 정규화를 수행하여 텍스트를 비교합니다.

false이면 확인하지 않습니다.

기본값은 false입니다.

자세한 내용은 https://unicode-org.github.io/icu/userguide/collation/concepts.html#normalization을 참조하세요.

다음 작업에 대해 데이터 정렬을 지정할 수 있습니다.

참고

한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다.

[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에는 숫자 필드 scoreprice와 문자열 필드 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" 키와 일치하지 않습니다. 이는 강도 매개변수에 설정한 값에 관계없이 적용됩니다.

다음 인덱스는 단순 바이너리 비교만 지원하며 데이터 정렬은 지원하지 않습니다.

단순 데이터 정렬이 아닌 collection에 text, 2d 또는 geoHaystack 인덱스를 만들려면 인덱스를 만들 때 {collation: {locale: "simple"} } 을 명시적으로 지정해야 합니다.

numericOrderingtrue로 지정하면 다음과 같은 제한 사항이 적용됩니다.

  • 비교에서는 연속된 음수가 아닌 정수 부분 문자열만 고려됩니다.

    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.22.10은 사전 순으로 정렬됩니다.

돌아가기

참조