Docs Menu
Docs Home
/ / /
루비 드라이버
/

데이터 정렬.

데이터 정렬은 일반적으로 특정 자연어에서 문자열을 비교하는 방법에 대한 규칙 세트입니다.

예를 들어, 캐나다 프랑스어에서는 특정 단어의 마지막 악센트에 따라 정렬 순서가 결정됩니다.

다음 프랑스어 단어를 살펴보겠습니다.

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 으 )로 구문 분석합니다. . 예를 들어 localeen_US 로 설정하여 미국 영어를 나타내거나 fr_CA 을(를) 캐나다 프랑스어를 나타내도록 설정합니다.

사용 가능한 매개변수에 대한 전체 설명은 MongoDB 수동 항목을 참조하세요.

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

모든 읽기, 업데이트 및 삭제 메서드는 데이터 정렬을 지원합니다. 아래에 몇 가지 예를 소개합니다.

개별 쿼리에서 결과를 일치시키고 정렬할 때 사용할 데이터 정렬을 지정할 수 있습니다. 다음 쿼리 및 정렬 작업은 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 )

컬렉션 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 }

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" }

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 값이 24 인 문서가 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

돌아가기

변경 사항 모니터링

이 페이지의 내용