데이터 정렬.
데이터 정렬은 MongoDB 3.4 이상에서 사용 가능합니다.
개요
본 가이드에서는 정렬 규칙 집합인 데어터 정렬을 사용하여 특정 언어 및 국가 및 언어 설정(공통 언어 관용구를 공유하는 커뮤니티 또는 리전)에 대해 문자열 순서를 사용하여 작업을 실행하는 방법을 설명합니다.
MongoDB는 기본적으로 바이너리 데이터 정렬 을 사용하여 문자열을 정렬합니다. 이 데이터 정렬 메서드는 ASCII 표준 을 사용합니다. 문자열을 비교하고 정렬하는 문자 값. 언어 및 국가 및 언어 설정에는 ASCII 표준과 다른 특정 문자 순서 규칙이 있습니다.
예를 들어, 캐나다 프랑스어에서는 기타 문자가 동일한 경우 맨 우측 악센트 문자에 따라 문자열 순서가 결정됩니다. 다음과 같은 프랑스어 단어를 생각해 봅니다, 즉 코트, 코테, 코트, 코테.
MongoDB는 기본값 바이너리 데이터 정렬을 사용하여 다음과 같은 순서로 정렬합니다.
cote coté côte côté
MongoDB는 캐나다 프랑스어 데이터 정렬을 사용하여 다음과 같은 순서로 정렬합니다.
cote côte coté côté
사용법
새 컬렉션 또는 새 인덱스 를 만들 때 데이터 정렬을 지정할 수 있습니다. CRUD 작업 및 애그리게이션에 대한 데이터 정렬을 지정할 수도 있습니다.
데이터 정렬을 사용하여 새 컬렉션을 생성하는 경우 해당 컬렉션에서 호출되는 데이터 정렬을 지원하는 모든 작업에 대한 기본값 데이터 정렬을 정의할 수 있습니다. 다양한 데이터 정렬을 지정하여 작업의 데이터 정렬을 재정의할 수 있습니다.
참고
현재는 기존 컬렉션에 데이터 정렬을 생성할 수 없습니다. 기존 컬렉션에서 데이터 정렬을 사용하려면 데이터 정렬이 있는 인덱스를 생성하고 해당 인덱스에 대한 작업에서 동일한 데이터 정렬을 지정합니다.
데이터 정렬을 사용하여 인덱스를 생성하는 경우 해당 인덱스를 사용하는 작업에 대한 정렬 순서를 지정합니다. 인덱스에서 데이터 정렬을 사용하려면 작업에 일치하는 데이터 정렬을 제공하고 작업은 인덱스를 사용해야 합니다. 인덱스 유형은 대부분 데이터 정렬을 지원하지만 다음과 같은 유형은 바이너리 비교만 지원합니다.
데이터 정렬 매개변수
데이터 정렬 객체에는 다음과 같은 매개 변수 등이 있습니다.
collation: { locale: <string>, caseLevel: <bool>, caseFirst: <string>, strength: <int>, numericOrdering: <bool>, alternate: <string>, maxVariable: <string>, backwards: <bool> }
데이터 정렬에서 locale
필드를 지정해야 합니다. 다른 모든 필드는 선택 사항입니다. 지원되는 국가 및 언어 설정의 전체 목록과 locale
필드의 기본값은 지원되는 언어 및 국가 및 언어 설정을 참조하세요. 각 필드에 대한 설명은 데이터 정렬 문서 MongoDB 수동 항목을 참조하세요.
데이터 정렬 예시
컬렉션에 기본값 데이터 정렬을 설정하다
다음 예제에서는 souvenirs
이라는 새 컬렉션을 만들고 "fr_CA
" 국가 및 언어 설정을 사용하여 기본 데이터 정렬을 할당합니다. 데이터 정렬은 해당 컬렉션에서 수행되는 데이터 정렬을 지원하는 모든 작업에 적용됩니다.
// Create the collection with a collation db.createCollection("souvenirs", { collation: { locale: "fr_CA" }, });
데이터 정렬을 지원하는 작업은 모두 컬렉션에서 정의된 데이터 정렬을 자동으로 적용합니다. 하단의 쿼리는 souvenirs
컬렉션을 검색하고 "fr_CA
" 국가 및 언어 설정 데이터 정렬을 적용합니다.
myColl.find({type: "photograph"});
데이터 정렬을 지원하는 작업에서 매개 변수로 다양한 데이터 정렬을 지정할 수 있습니다. 다음과 같은 쿼리는 "is
" 아이슬란드 국가 및 언어 설정 및 caseFirst
선택적 매개 변수를 "upper
" 값으로 지정합니다.
myColl.find({type: "photograph"}, { collation: { locale: "is", caseFirst: "upper" } } );
인덱스에 데이터 정렬을 할당하다
다음 예에서는 데이터 정렬이 "en_US
" 국가 및 언어 설정으로 설정된 컬렉션의 title
필드에 새 인덱스를 생성합니다.
myColl.createIndex( { 'title' : 1 }, { 'collation' : { 'locale' : 'en_US' } });
다음과 같은 쿼리는 저희가 생성한 인덱스를 사용합니다.
myColl.find({"year": 1980}, {"collation" : {"locale" : "en_US" }}) .sort({"title": -1});
다음과 쿼리는 저희가 생성한 인덱스를 사용하지 않습니다. 첫 번째 쿼리에는 데이터 정렬이 없고 두 번째 쿼리에는 인덱스의 데이터 정렬과 다른 강도 값 등이 있습니다.
// no collation specified myColl.find({"year": 1980}) .sort({"title": -1}); // collation differs from the one on the index myColl.find({"year": 1980}, {"collation" : {"locale" : "en_US", "strength": 2 }}) .sort({"title": -1});
데이터 정렬 쿼리 예시
컬렉션에서 문서를 읽고, 업데이트하고, 삭제하는 작업에는 데이터 정렬을 사용할 수 있습니다. 이 섹션에는 이러한 선택의 예가 포함되어 있습니다. 데이터 정렬을 지원하는 전체 작업 목록은 MongoDB 매뉴얼을 참조하세요.
find() 및 sort() 예시
다음 예시에서는 기본값 바이너리 데이터 정렬을 사용하는 컬렉션에서 find()
및 sort()
모두를 호출합니다. locale
매개변수의 값을 de
로(으로) 설정하여 독일어 데이터 정렬을 사용합니다.
myColl.find({ city: "New York" }, { collation: { locale: "de" } }) .sort({ name: 1 });
findOneAndUpdate() 예시
다음 예시에서는 기본값 바이너리 데이터 정렬을 사용하는 컬렉션에서 findOneAndUpdate()
작업을 호출합니다. 컬렉션에는 다음과 같은 문서 등이 있습니다.
{ "_id" : 1, "first_name" : "Hans" } { "_id" : 2, "first_name" : "Gunter" } { "_id" : 3, "first_name" : "Günter" } { "_id" : 4, "first_name" : "Jürgen" }
데이터 정렬을 지정 하지 않는 이 컬렉션에서 다음 findOneAndUpdate()
작업을 감안합니다.
myColl.findOneAndUpdate( { first_name : { $lt: "Gunter" } }, { $set: { verified: true } } );
" Gunter " 는 데이터 정렬을 사용하는 경우 가장 먼저 정렬된 결과이기 때문에 쿼리 문서의 $lt
비교 연산자 앞에 어휘적으로 일치하는 문서는 없습니다. 따라서 이 작업은 어떤 문서도 업데이트하지 않습니다.
국가 및 언어 설정이 de@collation=phonebook
으로 설정된 데이터 정렬을 사용하여 동일한 연산을 감안합니다. 이와 같은 국가 및 언어 설정은 첫 글자를 대문자로 표시하는 고유 명사의 우선 순위 지정 규칙 등이 있는 collation=phonebook
옵션을 지정합니다. de@collation=phonebook
국가 및 언어 설정 및 옵션은 움라우트가 있는 문자를 움라우트가 없는 동일한 문자보다 먼저 정렬합니다.
myColl.findOneAndUpdate( { first_name: { $lt: "Gunter" } }, { $set: { verified: true } }, { collation: { locale: "de@collation=phonebook" } }, );
de@collation=phonebook
에 지정된 데이터 정렬을 사용하여 "Günter" 어휘적으로 "Gunter" 앞에 findOneAndUpdate()
오기 때문에 이러한 작업은 다음과 같은 업데이트된 문서를 반환합니다.
{ lastErrorObject: { updatedExisting: true, n: 1 }, value: { _id: 3, first_name: 'Günter' }, ok: 1 }
findOneAndDelete() 예시
다음 예시에서는 기본값 바이너리 데이터 정렬을 사용하고 다음과 같은 문서가 있는 컬렉션에서 findOneAndDelete()
작업을 호출합니다.
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
이러한 예에서는 어휘 순서가 아닌, 숫자 순서를 기준으로 숫자 문자열을 정렬하기 위해 numericOrdering
데이터 정렬 매개변수를 true
로 설정했습니다.
myColl.findOneAndDelete( { a: { $gt: "100" } }, { collation: { locale: "en", numericOrdering: true } }, );
상단의 작업을 실행한 후 컬렉션에 다음과 같은 문서가 포함됩니다.
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" }
세 문서의 원본 컬렉션에 대해 데이터 정렬 없이 동일한 작업을 수행하는 경우 이는 문자열("16
", "84
", "179
")의 어휘 값을 기준으로 문서를 일치시키고, 쿼리 기준과 일치하는 첫 번째 문서를 삭제합니다.
await myColl.findOneAndDelete({ a: { $gt: "100" } });
모든 문서의 a
필드에 기준과 일치하는 어휘 값 ("100
" 어휘 값보다 큼) 이 있기 때문에 이 작업은 첫 번째 결과를 제거합니다. 상단의 작업을 실행한 후 컬렉션에 다음과 같은 문서 등이 있습니다.
{ "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
집계 예시
집계 와 함께 데이터 정렬을 사용하려면 다음을 수행합니다. 작업에서는 파이프라인 단계 배열 뒤에 옵션 필드에 데이터 정렬 문서를 전달합니다.
다음 예에서는 기본값 바이너리 데이터 정렬을 사용하는 컬렉션의 집계 파이프라인을 보여줍니다. 국가 및 언어 설정국가 및 언어 설정이 집계는 first_name
필드를 분류하고 각 그룹의 총 결과 수를 계산한 다음 독일 전화 번호부(de@collation=phonebook
국가 및 언어 설정) 순서에 따라 결과를 정렬합니다.
참고
집계에서 데이터 정렬 하나만 지정할 수 있습니다.
myColl.aggregate( [ { $group: { "_id": "$first_name", "nameCount": { "$sum": 1 } } }, { $sort: { "_id": 1 } }, ], { collation: { locale: "de@collation=phonebook" } }, );