문서 메뉴
문서 홈
/ / /
PHP 라이브러리 매뉴얼
/

데이터 정렬

이 페이지의 내용

  • 개요
  • 사용법
  • 데이터 정렬 매개변수
  • collection에 기본 데이터 정렬 할당
  • 인덱스에 데이터 정렬을 할당하다
  • 데이터 정렬을 지원하는 작업
  • find()sort
  • findOneAndUpdate()
  • findOneAndDelete()
  • deleteMany()
  • 집계

버전 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 로 구문 분석합니다. . 예를 들어 미국 영어를 나타내려면 localeen_US 로 설정하고, 캐나다 프랑스어를 나타내려면 fr_CA 를 설정합니다.

사용 가능한 매개변수에 대한 전체 설명은 MongoDB 매뉴얼의 데이터 정렬 문서 를 참조하세요.

다음 예제에서는 test 데이터베이스에 contacts 라는 새 컬렉션을 만들고 fr_CA 국가 및 언어 설정을 사용하여 기본 데이터 정렬을 할당합니다. collection을 만들 때 데이터 정렬을 지정하면 쿼리가 다른 데이터 정렬을 지정하지 않는 한 contacts collection에 대해 실행되는 쿼리와 관련된 모든 작업에서 fr_CA 데이터 정렬을 사용합니다. 생성 명령이 다른 데이터 정렬을 지정하지 않는 한 새 collection의 모든 인덱스도 기본 데이터 정렬을 상속합니다.

<?php
$database = (new MongoDB\Client)->test;
$database->createCollection('contacts', [
'collation' => ['locale' => 'fr_CA'],
]);

인덱스에 대한 데이터 정렬을 지정하려면 인덱스를 만들 때 collation 옵션을 사용합니다.

다음 예제에서는 name address_book 매개 변수를 활성화하고 을(를) 로 설정한 unique 기본 데이터 정렬을 사용하여 collection의 필드에 인덱스를 locale en_US만듭니다.

<?php
$collection = (new MongoDB\Client)->test->address_book;
$collection->createIndex(
['first_name' => 1],
[
'collation' => ['locale' => 'en_US'],
'unique' => true,
]
);

이 인덱스를 사용하려면 쿼리에서 동일한 데이터 정렬을 지정해야 합니다. 다음 쿼리는 위의 인덱스를 사용합니다.

<?php
$collection = (new MongoDB\Client)->test->address_book;
$cursor = $collection->find(
['first_name' => 'Adam'],
[
'collation' => ['locale' => 'en_US'],
]
);

다음 쿼리는 인덱스를 사용하지 않습니다 . 첫 번째 쿼리는 데이터 정렬을 사용하지 않고 두 번째 쿼리는 인덱스의 데이터 정렬과 다른 strength 값을 가진 데이터 정렬을 사용합니다.

<?php
$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,
],
]
);

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

개별 쿼리에서 결과를 일치시키고 정렬할 때 사용할 데이터 정렬을 지정할 수 있습니다. 다음 쿼리 및 정렬 작업은 locale 매개 변수가 de 로 설정된 독일어 데이터 정렬을 사용합니다.

<?php
$collection = (new MongoDB\Client)->test->contacts;
$cursor = $collection->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" }

컬렉션에 대한 다음 findOneAndUpdate() 작업은 데이터 정렬을 지정하지 않습니다.

<?php
$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 데이터 정렬에 따라 움라우트가 있는 문자는 움라우트가 없는 동일한 문자 앞에 옵니다.

<?php
$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 }

numericOrdering 데이터 정렬 매개변수를 true 로 설정하여 숫자 값으로 숫자 문자열을 비교합니다.

collection numbers 에는 다음 문서가 포함되어 있습니다.

{ "_id" : 1, "a" : "16" }
{ "_id" : 2, "a" : "84" }
{ "_id" : 3, "a" : "179" }

다음 예에서는 a 필드의 숫자 값이 100보다 큰 첫 번째 문서를 일치시켜 삭제합니다.

<?php
$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" 보다 큰 첫 번째 문서를 삭제합니다.

<?php
$collection = (new MongoDB\Client)->test->numbers;
$document = $collection->findOneAndDelete(['a' => ['$gt' =-> '100']]);

위의 작업이 실행된 후 a"16" 와 같은 문서가 삭제되었으며 다음 문서가 컬렉션에 남아 있습니다.

{ "_id" : 2, "a" : "84" }
{ "_id" : 3, "a" : "179" }

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 와 일치하는 모든 레코드를 삭제합니다.

<?php
$collection = (new MongoDB\Client)->test->recipes;
$collection->deleteMany(
['cuisine' => 'French'],
[
'collation' => [
'locale' => 'en_US',
'strength' => 1,
],
]
);

위의 작업이 실행된 후 _id 값이 24 인 문서가 collection에서 삭제됩니다.

aggregate() 작업에 데이터 정렬을 사용하려면 애그리게이션 옵션에서 데이터 정렬을 지정합니다.

다음 애그리게이션 예제에서는 collection을 사용하고 names first_name 필드를 그룹화하고, 각 그룹의 총 결과 수를 계산하고, 독일 전화번호부 순서를 기준으로 결과를 정렬합니다.

<?php
$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'],
]
);

돌아가기

코덱

다음

데이터베이스 명령 실행