Docs Menu
Docs Home
/ / /
Ruby MongoDB Driver
/

데이터 정렬.

이 페이지의 내용

  • 개요
  • 사용법
  • 데이터 정렬을 지원하는 작업

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

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

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

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

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

돌아가기

Atlas search 인덱스