데이터 정렬
이 페이지의 내용
버전 1.1에 추가 되었습니다.
개요
MongoDB 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' => <boolean>, 'caseFirst' => <string>, 'strength' => <integer>, 'numericOrdering' => <boolean>, 'alternate' => <string>, 'maxVariable' => <string>, 'normalization' => <boolean>, 'backwards' => <boolean>, ]
유일한 필수 매개변수는 locale
이며, 서버는 이 매개변수를 ICU 형식의 국가 및 언어 설정 ID 로 구문 분석합니다. . 예를 들어 미국 영어를 나타내려면 locale
을 en_US
로 설정하고, 캐나다 프랑스어를 나타내려면 fr_CA
를 설정합니다.
사용 가능한 매개변수에 대한 전체 설명은 MongoDB 매뉴얼의 데이터 정렬 문서 를 참조하세요.
collection에 기본 데이터 정렬 할당
다음 예제에서는 test
데이터베이스에 contacts
라는 새 컬렉션을 만들고 fr_CA
국가 및 언어 설정을 사용하여 기본 데이터 정렬을 할당합니다. collection을 만들 때 데이터 정렬을 지정하면 쿼리가 다른 데이터 정렬을 지정하지 않는 한 contacts
collection에 대해 실행되는 쿼리와 관련된 모든 작업에서 fr_CA
데이터 정렬을 사용합니다. 생성 명령이 다른 데이터 정렬을 지정하지 않는 한 새 collection의 모든 인덱스도 기본 데이터 정렬을 상속합니다.
$database = (new MongoDB\Client)->test; $database->createCollection('contacts', [ 'collation' => ['locale' => 'fr_CA'], ]);
인덱스에 데이터 정렬을 할당하다
인덱스에 대한 데이터 정렬을 지정하려면 인덱스를 만들 때 collation
옵션을 사용합니다.
다음 예제에서는 name
address_book
매개 변수를 활성화하고 을(를) 로 설정한 unique
기본 데이터 정렬을 사용하여 collection의 필드에 인덱스를 locale
en_US
만듭니다.
$collection = (new MongoDB\Client)->test->address_book; $collection->createIndex( ['first_name' => 1], [ 'collation' => ['locale' => 'en_US'], 'unique' => true, ] );
이 인덱스를 사용하려면 쿼리에서 동일한 데이터 정렬을 지정해야 합니다. 다음 쿼리는 위의 인덱스를 사용합니다.
$collection = (new MongoDB\Client)->test->address_book; $cursor = $collection->find( ['first_name' => 'Adam'], [ 'collation' => ['locale' => 'en_US'], ] );
다음 쿼리는 인덱스를 사용하지 않습니다 . 첫 번째 쿼리는 데이터 정렬을 사용하지 않고 두 번째 쿼리는 인덱스의 데이터 정렬과 다른 strength
값을 가진 데이터 정렬을 사용합니다.
$collection = (new MongoDB\Client)->test->address_book; $cursor1 = $collection->find(['first_name' => 'Adam']); $cursor2 = $collection->find( ['first_name' => 'Adam'], [ 'collation' => [ 'locale' => 'en_US', 'strength' => 2, ], ] );
데이터 정렬을 지원하는 작업
모든 읽기, 업데이트 및 삭제 메서드는 데이터 정렬을 지원합니다. 아래에 몇 가지 예를 소개합니다.
find()
와 sort
개별 쿼리에서 결과를 일치시키고 정렬할 때 사용할 데이터 정렬을 지정할 수 있습니다. 다음 쿼리 및 정렬 작업은 locale
매개 변수가 de
로 설정된 독일어 데이터 정렬을 사용합니다.
$collection = (new MongoDB\Client)->test->contacts; $cursor = $collection->find( ['city' => 'New York'], [ 'collation' => ['locale' => 'de'], 'sort' => ['name' => 1], ] );
findOneAndUpdate()
컬렉션 names
에는 다음 문서가 포함되어 있습니다.
{ "_id" : 1, "first_name" : "Hans" } { "_id" : 2, "first_name" : "Gunter" } { "_id" : 3, "first_name" : "Günter" } { "_id" : 4, "first_name" : "Jürgen" }
컬렉션에 대한 다음 findOneAndUpdate()
작업은 데이터 정렬을 지정하지 않습니다.
$collection = (new MongoDB\Client)->test->names; $document = $collection->findOneAndUpdate( ['first_name' => ['$lt' => 'Gunter']], ['$set' => ['verified' => true]] );
Gunter
은(는) 어휘적으로 collection에서 첫 번째이므로 위의 연산은 결과를 반환하지 않고 문서를 업데이트하지 않습니다.
국가 및 언어 설정 de@collation=phonebook
를 사용하는 동일한 findOneAndUpdate()
연산이지만 데이터 정렬이 지정되어 있다고 가정해 보겠습니다.
참고
일부 국가 및 언어 설정에는 고유 명사를 다른 단어와 다르게 정렬하는 언어에 사용할 수 있는 collation=phonebook
옵션이 있습니다. de@collation=phonebook
데이터 정렬에 따라 움라우트가 있는 문자는 움라우트가 없는 동일한 문자 앞에 옵니다.
$collection = (new MongoDB\Client)->test->names; $document = $collection->findOneAndUpdate( ['first_name' => ['$lt' => 'Gunter']], ['$set' => ['verified' => true]], [ 'collation' => ['locale' => 'de@collation=phonebook'], 'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER, ] );
이 작업은 다음과 같은 업데이트된 문서를 반환합니다.
{ "_id" => 3, "first_name" => "Günter", "verified" => true }
findOneAndDelete()
numericOrdering
데이터 정렬 매개변수를 true
로 설정하여 숫자 값으로 숫자 문자열을 비교합니다.
collection numbers
에는 다음 문서가 포함되어 있습니다.
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
다음 예에서는 a
필드의 숫자 값이 100보다 큰 첫 번째 문서를 일치시켜 삭제합니다.
$collection = (new MongoDB\Client)->test->numbers; $document = $collection->findOneAndDelete( ['a' => ['$gt' =-> '100']], [ 'collation' => [ 'locale' => 'en', 'numericOrdering' => true, ], ] );
위의 작업 후에도 collection에 다음 문서가 남아 있습니다.
{ "_id" : 1, "a" : "16" } { "_id" : 2, "a" : "84" }
데이터 정렬 없이 동일한 작업을 수행하는 경우, 서버는 a
의 어휘 값이 "100"
보다 큰 첫 번째 문서를 삭제합니다.
$collection = (new MongoDB\Client)->test->numbers; $document = $collection->findOneAndDelete(['a' => ['$gt' =-> '100']]);
위의 작업이 실행된 후 a
가 "16"
와 같은 문서가 삭제되었으며 다음 문서가 컬렉션에 남아 있습니다.
{ "_id" : 2, "a" : "84" } { "_id" : 3, "a" : "179" }
deleteMany()
MongoDB PHP 라이브러리에 존재하는 다양한 CRUD 작업 모두와 함께 데이터 정렬을 사용할 수 있습니다.
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
와 일치하는 모든 레코드를 삭제합니다.
$collection = (new MongoDB\Client)->test->recipes; $collection->deleteMany( ['cuisine' => 'French'], [ 'collation' => [ 'locale' => 'en_US', 'strength' => 1, ], ] );
위의 작업이 실행된 후 _id
값이 2
및 4
인 문서가 collection에서 삭제됩니다.
집계
aggregate()
작업에 데이터 정렬을 사용하려면 애그리게이션 옵션에서 데이터 정렬을 지정합니다.
다음 애그리게이션 예제에서는 collection을 사용하고 names
first_name
필드를 그룹화하고, 각 그룹의 총 결과 수를 계산하고, 독일 전화번호부 순서를 기준으로 결과를 정렬합니다.
$collection = (new MongoDB\Client)->test->names; $cursor = $collection->aggregate( [ ['$group' => ['_id' => '$first_name', 'name_count' => ['$sum' => 1]]], ['$sort' => ['_id' => 1]], ], [ 'collation' => ['locale' => 'de@collation=phonebook'], ] );