개요
데이터 정렬은 일반적으로 특정 자연어에서 문자열을 비교하는 방법에 대한 규칙 세트입니다.
예를 들어, 캐나다 프랑스어에서는 특정 단어의 마지막 악센트에 따라 정렬 순서가 결정됩니다.
다음 프랑스어 단어를 살펴보겠습니다.
cote < coté < côte < côté
캐나다 프랑스어 데이터 정렬을 사용하는 정렬 순서의 결과는 다음과 같습니다.
cote < côte < coté < côté
데이터 정렬이 지정되지 않은 경우, MongoDB는 문자열에 단순 이진 비교를 사용합니다. 따라서 단어의 정렬 순서는 다음과 같습니다.
cote < coté < côte < côté
사용법
collection과 인덱스가 생성될 때 기본 데이터 정렬을 지정하거나, CRUD 및 애그리게이션에 대한 데이터 정렬을 지정할 수 있습니다. 데이터 정렬을 지원하는 작업의 경우 MongoDB는 작업에서 다른 데이터 정렬을 지정하지 않는 한 컬렉션의 기본 데이터 정렬을 사용합니다.
데이터 정렬 매개변수
'collation' => { 'locale' => <string>, 'caseLevel' => <bool>, 'caseFirst' => <string>, 'strength' => <int>, 'numericOrdering' => <bool>, 'alternate' => <string>, 'maxVariable' => <string>, 'normalization' => <bool>, 'backwards' => <bool> }
유일한 필수 매개변수는 locale
이며, 서버는 이 매개변수를 ICU 형식 국가 및 언어 설정 ID 으 )로 구문 분석합니다. . 예를 들어 locale
를 en_US
로 설정하여 미국 영어를 나타내거나 fr_CA
을(를) 캐나다 프랑스어를 나타내도록 설정합니다.
사용 가능한 매개변수에 대한 전체 설명은 MongoDB 수동 항목을 참조하세요.
collection에 기본 데이터 정렬 할당
다음 예제에서는 test
데이터베이스에 contacts
라는 새 컬렉션을 만들고 fr_CA
국가 및 언어 설정을 사용하여 기본 데이터 정렬을 할당합니다. collection을 만들 때 데이터 정렬을 지정하면 쿼리가 다른 데이터 정렬을 지정하지 않는 한 contacts
collection에 대해 실행되는 쿼리와 관련된 모든 작업에서 fr_CA
데이터 정렬을 사용합니다. 생성 명령이 다른 데이터 정렬을 지정하지 않는 한 새 collection의 모든 인덱스도 기본 데이터 정렬을 상속합니다.
client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test") client[:contacts, { "collation" => { "locale" => "fr_CA" } } ].create
인덱스에 데이터 정렬을 할당하다
인덱스에 대한 데이터 정렬을 지정하려면 인덱스를 만들 때 collation
옵션을 사용합니다.
다음 예제에서는 name
address_book
매개 변수를 활성화하고 을(를) 로 설정한 unique
기본 데이터 정렬을 사용하여 collection의 필드에 인덱스를 locale
en_US
만듭니다.
client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test") client[:address_book].indexes.create_one( { "first_name" => 1 }, "unique" => true, "collation" => { "locale" => "en_US" } )
이 인덱스를 사용하려면 쿼리에서 동일한 데이터 정렬을 지정해야 합니다. 다음 쿼리는 위의 인덱스를 사용합니다.
client[:address_book].find({"first_name" : "Adam" }, "collation" => { "locale" => "en_US" })
다음 쿼리는 인덱스를 사용하지 않습니다 . 첫 번째 쿼리는 데이터 정렬을 사용하지 않고 두 번째 쿼리는 인덱스의 데이터 정렬과 다른 strength
값을 가진 데이터 정렬을 사용합니다.
client[:address_book].find({"first_name" : "Adam" }) client[:address_book].find({"first_name" : "Adam" }, "collation" => { "locale" => "en_US", "strength" => 2 })
데이터 정렬을 지원하는 작업
모든 읽기, 업데이트 및 삭제 메서드는 데이터 정렬을 지원합니다. 아래에 몇 가지 예를 소개합니다.
find()
개인정보 정책에 sort()
개별 쿼리에서 결과를 일치시키고 정렬할 때 사용할 데이터 정렬을 지정할 수 있습니다. 다음 쿼리 및 정렬 작업은 locale
매개 변수가 de
로 설정된 독일어 데이터 정렬을 사용합니다.
client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test") docs = client[:contacts].find({ "city" => "New York" }, { "collation" => { "locale" => "de" } }).sort( "name" => 1 )
find_one_and_update()
컬렉션 names
에는 다음 문서가 포함되어 있습니다.
{ "_id" : 1, "first_name" : "Hans" } { "_id" : 2, "first_name" : "Gunter" } { "_id" : 3, "first_name" : "Günter" } { "_id" : 4, "first_name" : "Jürgen" }
컬렉션에 대한 다음 find_one_and_update
작업은 데이터 정렬을 지정하지 않습니다.
client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test") doc = client[:names].find_one_and_update( {"first_name" => { "$lt" => "Gunter" }}, { "$set" => { "verified" => true } })
Gunter
은(는) 어휘적으로 collection에서 첫 번째이므로 위의 연산은 결과를 반환하지 않고 문서를 업데이트하지 않습니다.
데이터 정렬이 지정된 동일한 find_one_and_update
연산을 고려합니다. 국가 및 언어 설정은 de@collation=phonebook
로 설정됩니다.
참고
일부 국가 및 언어 설정에는 고유 명사를 다른 단어와 다르게 정렬하는 언어에 사용할 수 있는 collation=phonebook
옵션이 있습니다. de@collation=phonebook
데이터 정렬에 따라 움라우트가 있는 문자는 움라우트가 없는 동일한 문자 앞에 옵니다.
client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test") doc = client[:names].find_one_and_update( { "first_name" => { "$lt" => "Gunter" } }, { "$set" => { "verified" => true } }, { "collation" => { "locale" => "de@collation=phonebook" }, :return_document => :after } )
이 작업은 다음과 같은 업데이트된 문서를 반환합니다.
{ "_id" => 3, "first_name" => "Günter", "verified" => true }
find_one_and_delete()
numericOrdering
데이터 정렬 매개변수를 true
로 설정하여 숫자 값으로 숫자 문자열을 비교합니다.
collection numbers
에는 다음 문서가 포함되어 있습니다.
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
다음 예에서는 a
필드의 숫자 값이 100보다 큰 첫 번째 문서를 일치시켜 삭제합니다.
docs = numbers.find_one_and_delete({ "a" => { "$gt" => "100" } }, { "collation" => { "locale" => "en", "numericOrdering" => true } })
위의 작업 후에도 collection에 다음 문서가 남아 있습니다.
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" }
데이터 정렬 없이 동일한 작업을 수행하는 경우, 서버는 a
의 어휘 값이 "100"
보다 큰 첫 번째 문서를 삭제합니다.
numbers = client[:numbers] docs = numbers.find_one_and_delete({ "a" => { "$gt" => "100" } })
위의 작업 후 a
와 "16"
같은 문서가 삭제되었으며 collection에 다음 문서가 남아 있습니다.
{ "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
delete_many()
Ruby 드라이버에 존재하는 다양한 대량 작업 모두에 데이터 정렬을 사용할 수 있습니다.
collection recipes
에는 다음 문서가 포함되어 있습니다.
{ "_id" : 1, "dish" : "veggie empanadas", "cuisine" : "Spanish" } { "_id" : 2, "dish" : "beef bourgignon", "cuisine" : "French" } { "_id" : 3, "dish" : "chicken molé", "cuisine" : "Mexican" } { "_id" : 4, "dish" : "chicken paillard", "cuisine" : "french" } { "_id" : 5, "dish" : "pozole verde", "cuisine" : "Mexican" }
데이터 정렬 문서의 strength
매개변수를 1
또는 2
로 설정하면 서버가 쿼리 필터에서 대소문자를 무시합니다. 다음 예제에서는 대소문자를 구분하지 않는 쿼리 필터를 사용하여 cuisine
필드가 French
와 일치하는 모든 레코드를 삭제합니다.
client = Mongo::Client.new([ "127.0.0.1:27017" ], :database => "test") recipes = client[:recipes] docs = recipes.delete_many({ "cuisine" => "French" }, "collation" => { "locale" => "en_US", "strength" => 1 })
위의 작업이 실행된 후 _id
값이 2
및 4
인 문서가 collection에서 삭제됩니다.
집계
애그리게이션 작업에 데이터 정렬을 사용하려면 애그리게이션 옵션에서 데이터 정렬을 지정합니다.
다음 애그리게이션 예제에서는 collection을 사용하고 names
first_name
필드를 그룹화하고, 각 그룹의 총 결과 수를 계산하고, 독일 전화번호부 순서를 기준으로 결과를 정렬합니다.
aggregation = names.aggregate( [ { "$group" => { "_id" => "$first_name", "name_count" => { "$sum" => 1 } } }, { "$sort" => { "_id" => 1 } }, ], { "collation" => { "locale" => "de@collation=phonebook" } } ) aggregation.each do |doc| #=> Yields a BSON::Document. end