문서 메뉴
문서 홈
/ / /
Java 동기화 드라이버
/

데이터 정렬.

이 페이지의 내용

  • 개요
  • MongoDB의 데이터 정렬
  • 데이터 정렬 지정 방법
  • 컬렉션
  • 인덱스
  • 작업
  • 데이터 정렬을 지원하지 않는 인덱스 유형
  • 데이터 정렬 옵션
  • 데이터 정렬 예시
  • find() 및 sort() 예시
  • findOneAndUpdate() 예시
  • findOneAndDelete() 예제
  • 애그리게이션 예시

이 가이드에서는 MongoDB와 데이터 정렬 을 사용하여 문자열 값을 기준으로 쿼리 또는 애그리게이션 작업 결과를 정렬하는 방법에 대해 설명합니다. 데이터 정렬은 특정 언어 및 국가 및 언어 설정에 적용되는 문자 순서 및 일치 규칙 집합입니다.

이 가이드의 다음 섹션에서 데이터 정렬에 대해 자세히 알아볼 수 있습니다.

  • MongoDB의 데이터 정렬

  • 데이터 정렬 지정 방법

  • 데이터 정렬 옵션

  • 데이터 정렬 코드 예시

MongoDB는 기본적으로 바이너리 데이터 정렬 을 사용하여 문자열을 정렬합니다. 바이너리 데이터 정렬은 ASCII 표준 을 사용합니다. 문자열을 비교하고 정렬하는 문자 값. 특정 언어 및 국가 및 언어 설정에는 ASCII 문자 값과 다른 특정 문자 순서 규칙이 있습니다.

예를 들어, 캐나다 프랑스어에서는 앞의 모든 문자가 동일한 경우 맨 오른쪽 악센트 문자(분음 부호)에 따라 문자열 순서가 결정됩니다. 다음 캐나다 프랑스어 단어를 생각해 보세요.

  • 코트

  • coté

  • 코트

바이너리 데이터 정렬을 사용할 때 MongoDB는 다음과 같은 순서로 정렬합니다.

cote
coté
côte
côté

캐나다 프랑스어 데이터 정렬을 사용하는 경우 MongoDB는 아래와 같이 다른 순서로 정렬합니다.

cote
côte
coté
côté

MongoDB는 대부분의 CRUD 작업 및 애그리게이션에서 데이터 정렬을 지원합니다. 지원되는 작업의 전체 목록은 데이터 정렬 서버를 지원하는 작업 매뉴얼 페이지를 참조하세요.

다음 문자열 형식으로 국가 및 언어 설정 코드 및 선택적 변형을 지정할 수 있습니다.

"<locale code>@collation=<variant code>"

다음 예제에서는 "de" 국가 및 언어 설정 코드 및 "전화번호부" 변형 코드를 지정합니다.

"de@collation=phonebook"

변형을 지정하지 않는 경우 다음과 같이 국가 및 언어 설정 코드 뒤의 내용을 모두 생략합니다.

"de"

지원되는 국가 및 언어 설정의 전체 목록은 지원 되는 언어 및 국가 및 언어에 대한 서버 매뉴얼 페이지를 참조하세요.

다음 섹션에서는 MongoDB에서 데이터 정렬을 적용하는 다양한 방법을 보여줍니다.

collection을 생성할 때 기본 데이터 정렬을 설정할 수 있습니다. 지정된 데이터 정렬을 사용하여 collection을 생성하는 경우 해당 collection을 스캔하는 지원되는 모든 작업은 데이터 정렬 규칙을 적용합니다.

해당 컬렉션을 생성할 때만 컬렉션에 기본 데이터 정렬을 할당할 수 있습니다. 그러나 기존 컬렉션의 새 인덱스에 데이터 정렬을 지정할 수 있습니다. 자세한 내용은 이 가이드의 인덱스 섹션을 참조하세요.

다음 스니펫은 items 이라는 새 컬렉션을 만들 때 "en_US" 국가 및 언어 설정 데이터 정렬을 지정하는 방법을 보여줍니다.

database.createCollection(
"items",
new CreateCollectionOptions().collation(
Collation.builder().locale("en_US").build()));

데이터 정렬이 성공적으로 생성되었는지 확인하려면 다음과 같이 해당 collection의 인덱스 목록을 조회하세요.

MongoCollection<Document> collection = database.getCollection("items");
List<Document> indexes = new ArrayList<>();
collection.listIndexes().into(indexes);
// Prints the collection's indexes and any default collations
indexes.forEach(idx -> System.out.println(idx.toJson()));

코드 출력에는 다음이 포함되어야 합니다.

{ ...
"collation": { "locale": "en_US", ... }
...
}

collection에 새 인덱스를 만들 때 데이터 정렬을 지정할 수 있습니다. 인덱스는 문서의 정렬된 표현을 collection에 저장하므로 작업이 메모리 내에서 정렬을 수행하지 않습니다. 인덱스를 사용하려면 작업이 다음 기준을 충족해야 합니다.

  • 이 작업은 인덱스에 지정된 것과 동일한 데이터 정렬을 사용합니다.

  • 이 작업은 데이터 정렬이 포함된 인덱스에 의해 처리됩니다.

다음 코드 스니펫은 "en_US" 국가 및 언어 설정 데이터 정렬을 사용하여 "name" 필드에 오름차순으로 인덱스를 생성하는 방법을 보여줍니다.

MongoCollection<Document> collection = database.getCollection("items");
IndexOptions idxOptions = new IndexOptions();
// Defines options that set a collation locale
idxOptions.collation(Collation.builder().locale("en_US").build());
// Creates an index on the "name" field with the collation and ascending sort order
collection.createIndex(Indexes.ascending("name"), idxOptions);

데이터 정렬이 성공적으로 생성되었는지 확인하려면 다음과 같이 해당 collection의 인덱스 목록을 조회하세요.

MongoCollection<Document> collection = database.getCollection("items");
List<Document> indexes = new ArrayList<>();
collection.listIndexes().into(indexes);
// Prints the collection's indexes and any default collations
indexes.forEach(idx -> System.out.println(idx.toJson()));

이전 코드의 출력에는 다음이 포함되어야 합니다.

{ ...
"collation": { "locale": "en_US", ... }
...
}

다음 코드 스니펫은 동일한 데이터 정렬을 지정하고 이전 코드 스니펫에서 만든 인덱스로 처리되는 작업 예시를 보여줍니다.

FindIterable<Document> cursor = collection.find()
.collation(Collation.builder().locale("en_US").build())
.sort(Sorts.ascending("name"));

지원되는 작업 중 하나에 새 데이터 정렬을 매개 변수로 전달하여 컬렉션의 기본 데이터 정렬을 재정의할 수 있습니다. 그러나 이 작업은 인덱스를 사용하지 않으므로 인덱스에 포함되는 작업만큼 작업이 수행되지 않을 수 있습니다. 인덱스에 포함되지 않는 정렬 작업의 단점에 대한 자세한 내용은 인덱스를 사용하여 쿼리 결과 정렬에 대한 서버 매뉴얼 페이지를 참조하세요.

다음 코드 스니펫은 다음과 같은 특성을 가진 쿼리 작업의 예시를 보여줍니다.

  • 참조된 컬렉션에는 컬렉션 섹션에 지정된 것과 유사한 기본 데이터 정렬 'en_US'가 포함되어 있습니다.

  • 쿼리가 collection의 기본 데이터 정렬 인덱스에 포함되지 않는 아이슬란드어("is") 데이터 정렬을 지정합니다.

  • 지정된 데이터 정렬은 인덱스에 포함되지 않으므로 정렬 작업은 인메모리에서 수행됩니다.

FindIterable<Document> cursor = collection.find()
.collation(Collation.builder().locale("is").build())
.sort(Sorts.ascending("name"));

대부분의 MongoDB 인덱스 유형은 데이터 정렬을 지원하지만 다음과 같은 유형은 이진 비교만 지원합니다.

이 섹션에서는 다양한 데이터 정렬 옵션과 이를 지정하여 순서 지정 및 일치 동작을 더욱 세분화하는 방법을 설명합니다.

데이터 정렬 옵션
설명
로캘
필수. 언어 및 변형에 대한 ICU 국가 및 언어 설정 코드입니다.
locale() API 문서
이전
문자열의 끝에서 발음 부호를 먼저 고려할지 여부입니다.
backwards() API 문서
대소문자 구분
대소문자(대소문자)를 다른 값으로 고려할지 여부입니다.
caseLevel() API 문서
대체
공백과 구두점을 고려할지 여부입니다.
caseFirst
대문자 또는 소문자를 먼저 고려할지 여부입니다.
최대 변수
공백을 무시할지, 아니면 공백과 문장 부호를 모두 무시할지 여부입니다. 이 설정은 대체 설정이 "이동된" 경우에만 유효합니다.
강도
ICU 비교 수준. 기본값은 "3차"입니다. 각 레벨에 대한 자세한 내용은 ICU 비교 레벨 을 참조하세요. .
정규화
필요에 따라 텍스트에 유니코드 정규화를 수행할지 여부입니다. 유니코드 정규화에 대한 자세한 내용은 유니 코드 정규화 양식 을 참조하세요. .
정규화() API 문서
numericOrdering
데이터 정렬 순서가 아닌 숫자 값에 따라 숫자를 정렬할지 여부.

Collation.Builder 클래스를 사용하여 앞의 데이터 정렬 옵션에 대한 값을 지정할 수 있습니다. 다음 코드 스니펫에 표시된 대로 build() 메서드를 호출하여 Collation 객체를 구성할 수 있습니다.

Collation.builder()
.caseLevel(true)
.collationAlternate(CollationAlternate.SHIFTED)
.collationCaseFirst(CollationCaseFirst.UPPER)
.collationMaxVariable(CollationMaxVariable.SPACE)
.collationStrength(CollationStrength.SECONDARY)
.locale("en_US")
.normalization(false)
.numericOrdering(true)
.build();

사용하는 해당 메서드 및 매개 변수에 대한 자세한 내용은 Collation.Builder에 대한 API 설명서를 참조하세요.

이 섹션에는 데이터 정렬을 지원하는 MongoDB 작업을 사용하는 방법을 보여주는 예제가 포함되어 있습니다. 각 예에서 다음과 같은 문서 컬렉션으로 시작한다고 가정합니다.

{ "_id" : 1, "first_name" : "Klara" }
{ "_id" : 2, "first_name" : "Gunter" }
{ "_id" : 3, "first_name" : "Günter" }
{ "_id" : 4, "first_name" : "Jürgen" }
{ "_id" : 5, "first_name" : "Hannah" }

다음 예제에서는 "de@collation=phonebook" 국가 및 언어 설정 및 변형 데이터 정렬을 지정합니다. 데이터 정렬의 "de" 부분은 독일어 국가 및 언어 설정을 지정하고 "collation=phonebook" 부분은 변형을 지정합니다. "de" 국가 및 언어 설정 데이터 정렬에는 첫 글자를 대문자로 식별하는 고유 명사의 우선 순위 지정 규칙이 포함되어 있습니다. "collation=phonebook" 변형에서는 오름차순 정렬에서 움라우트가 있는 문자가 없는 문자보다 먼저 정렬됩니다.

다음 예제는 collection에서 정렬된 결과를 검색할 때 데이터 정렬을 적용하는 방법을 보여줍니다. 이 작업을 수행하려면 예제 collection에서 find() 를 호출하고 collation()sort() 메서드를 연결하여 결과를 받을 순서를 지정합니다.

참고

다음 코드 예시에서는 편의상 import com.mongodb.client.model 패키지에서 가져오기를 사용합니다.

List<Document> results = new ArrayList<>();
// Retrieves all documents and applies a "de@collation-phonebook" collation and ascending sort to the results
collection.find()
.collation(Collation.builder().locale("de@collation=phonebook").build())
.sort(Sorts.ascending("first_name")).into(results);
// Prints the JSON representation of the results
if (results != null) {
results.forEach(doc -> System.out.println(doc.toJson()));
}

예제 collection 에서 이 작업을 수행하면 출력은 다음과 유사합니다.

{"_id": 3, "first_name": "Günter"}
{"_id": 2, "first_name": "Gunter"}
{"_id": 5, "first_name": "Hannah"}
{"_id": 4, "first_name": "Jürgen"}
{"_id": 1, "first_name": "Klara"}

이 섹션에 언급된 메서드 및 클래스에 대한 자세한 내용은 다음 API 문서를 참조하세요.

이 섹션에서는 쿼리에서 첫 번째 일치 항목을 업데이트하는 작업에서 데이터 정렬을 지정하는 방법을 보여줍니다. 이 작업에 대한 데이터 정렬을 지정하려면 FindOneAndUpdateOptions 객체를 인스턴스화하고, 데이터 정렬을 설정한 후, findOneAndUpdate() 메서드 호출에 매개변수로 전달합니다.

이 예에서는 다음을 보여줍니다.

  • 예제 컬렉션에서 오름차순으로 'Gunter' 앞에 오는 첫 번째 문서를 오름차순으로 검색합니다.

  • "de@collation=phonebook" 데이터 정렬을 포함한 작업 옵션을 설정합니다.

  • 값이 'true'인 새 필드 'verified'를 추가합니다.

  • 업데이트된 문서를 조회하고 출력합니다.

참고

다음 코드 예시에서는 편의상 import com.mongodb.client.model 패키지에서 가져오기를 사용합니다.

Document result = collection.findOneAndUpdate(
Filters.gt("first_name", "Gunter"),
Updates.set("verified", true),
new FindOneAndUpdateOptions()
.collation(Collation.builder().locale("de@collation=phonebook").build())
.sort(Sorts.ascending("first_name"))
.returnDocument(ReturnDocument.AFTER));
// Prints the JSON representation of the updated document if an update occurred
if (result != null) {
System.out.println("Updated document: " + result.toJson());
}

'Günter'는 오름차순으로 de@collation=phonebook 데이터 정렬을 사용하여 어휘적으로 'Gunter'보다 앞에 오기 때문에, 이전 작업은 다음 업데이트 문서를 반환합니다.

{
lastErrorObject: { updatedExisting: true, n: 1 },
value: { _id: 3, first_name: 'Günter' },
ok: 1
}

이 섹션에 언급된 메서드 및 클래스에 대한 자세한 내용은 다음 API 문서를 참조하세요.

이 섹션에서는 쿼리에서 첫 번째 일치 항목을 삭제하는 작업에서 데이터 정렬에서 문자열의 숫자 순서를 지정하는 방법을 보여 줍니다. 이 작업에 대한 데이터 정렬을 지정하려면 FindOneAndDeleteOptions 객체를 인스턴스화하고 숫자 순서 데이터 정렬을 설정한 다음 findOneAndDelete() 메서드 호출에 매개변수로 전달합니다.

이 예시에서는 다음 문서가 포함된 collection에서 findOneAndDelete() 작업을 호출합니다.

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

데이터 정렬에서는 숫자 순서를 기준으로 문자열을 정렬하기 위해 locale 옵션을 "en"으로 설정하고 numericOrdering 옵션을 "true"로 설정합니다.

참고

다음 코드 예시에서는 편의상 import com.mongodb.client.model 패키지에서 가져오기를 사용합니다.

Document result = collection.findOneAndDelete(
Filters.gt("a", "100"),
new FindOneAndDeleteOptions()
.collation(
Collation.builder()
.locale("en")
.numericOrdering(true)
.build())
.sort(Sorts.ascending("a")));
// Prints the JSON representation of the deleted document
if (result != null) {
System.out.println("Deleted document: " + result.toJson());
}

앞의 작업을 실행하면 출력은 다음과 유사합니다.

Deleted document: {"_id": 3, "a": "179 bananas"}

문자열 "179"의 숫자 값이 숫자 100보다 크므로 앞의 문서가 유일하게 일치합니다.

3개 문서의 원본 컬렉션에 대해 숫자 순서 데이터 정렬 없이 동일한 작업을 수행하는 경우, 필터는 바이너리 데이터 정렬로 정렬할 때 '100' 이 '16', '84', '179' 보다 앞에 오게 되므로 모든 문서와 일치합니다.

이 섹션에 언급된 메서드 및 클래스에 대한 자세한 내용은 다음 API 문서를 참조하세요.

이 섹션에서는 애그리게이션 작업에서 데이터 정렬을 지정하는 방법을 설명합니다. 애그리게이션 작업에서는 집합적으로 집계 파이프라인이라고 하는 일련의 애그리게이션 단계를 지정할 수 있습니다. 애그리게이션을 수행하려면 MongoCollection 객체에서 aggregate() 메서드를 호출합니다.

애그리게이션 작업에 대한 데이터 정렬을 지정하려면 애그리게이션 작업에서 반환된 AggregateIterable 에서 collation() 메서드를 호출합니다. 집계 파이프라인에서 데이터 정렬을 적용할 정렬 애그리게이션 단계를 지정해야 합니다.

다음 예시는 예시 컬렉션에서 집계 파이프라인을 생성하고 다음을 지정하여 데이터 정렬을 적용하는 방법을 보여 줍니다.

  • Aggregates.group() 헬퍼를 사용하여 first_name 필드로 각 문서를 식별하고 해당 값을 결과의 _id 로 사용하는 그룹 애그리게이션 단계입니다.

  • 그룹 애그리게이션 단계에서 first_name 필드에서 값이 일치하는 인스턴스 수를 합산하는 축적자입니다.

  • 이전 애그리게이션 단계의 출력 문서의 _id 필드에 오름차순 정렬을 적용합니다.

  • 독일어 국가 및 언어 설정과 악센트 및 움라우트를 무시하는 데이터 정렬 강도를 지정하여 데이터 정렬 객체를 생성합니다.

Bson groupStage = Aggregates.group("$first_name", Accumulators.sum("nameCount", 1));
Bson sortStage = Aggregates.sort(Sorts.ascending("_id"));
AggregateIterable<Document> results = collection
// Runs the aggregation pipeline that includes tallying "first_name" frequencies
.aggregate(Arrays.asList(groupStage, sortStage))
// Applies a collation to sort documents alphabetically by using the German locale, ignoring accents
.collation(Collation.builder().locale("de").collationStrength(CollationStrength.PRIMARY).build());
// Prints the JSON representation of the results
if (results != null) {
results.forEach(doc -> System.out.println(doc.toJson()));
}

앞의 코드는 다음 문서를 출력합니다.

{"_id": "Gunter", "nameCount": 2}
{"_id": "Hannah", "nameCount": 1}
{"_id": "Jürgen", "nameCount": 1}
{"_id": "Klara", "nameCount": 1}

이 섹션에 언급된 메서드 및 클래스에 대한 자세한 내용은 다음 API 문서를 참조하세요.

← 색인
로깅 →