AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

데이터 정렬.

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

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

중요

프로젝트 리액터 라이브러리

이 가이드 에서는 Project Reactor 라이브러리를 사용하여 Java Reactive Streams 운전자 메서드에서 반환된 Publisher 인스턴스를 사용합니다. 프로젝트 Reactor 라이브러리와 사용 방법에 대해 자세히 학습 Reactor 문서에서 시작하기 참조하세요. 이 가이드에서 Project Reactor 라이브러리 메서드를 사용하는 방법에 대해 자세히 학습하려면 MongoDB에 데이터 쓰기 가이드를 참조하세요.

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

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

  • 코트

  • coté

  • côte

  • côté

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

cote
coté
côte
côté

캐나다 프랑스어 데이터 정렬을 사용할 때 MongoDB는 다음과 같은 순서로 정렬합니다.

cote
côte
coté
côté

MongoDB는 대부분의 CRUD 작업과 집계에서 데이터 정렬을 지원합니다. 지원되는 작업의 완전한 목록은 MongoDB Server 수동의 데이터 정렬을 지원하는 작업 을 참조하십시오.

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

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

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

"de@collation=phonebook"

변형을 지정하지 않는 경우 국가 및 언어 설정 코드만 사용합니다.

지원되는 국가 및 언어 설정의 완전한 목록은 MongoDB Server 수동에서 지원되는 언어 및 국가 및 언어 설정 을 참조하십시오.

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

기본 데이터 정렬은 컬렉션 생성 시에만 설정할 수 있습니다. 그러나 기존 컬렉션의 새 인덱스에 데이터 정렬을 지정할 수 있습니다. 컬렉션을 스캔하는 지원되는 모든 작업에 기본값 데이터 정렬이 적용됩니다. 자세한 내용은 이 가이드의 인덱스 섹션을 참조하세요.

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

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

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

List<Document> indexes = Flux.from(itemsCollection.listIndexes())
.collectList().block();
if (indexes != null) {
indexes.forEach(idx -> System.out.println(idx.toJson()));
}

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

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

컬렉션에 새 인덱스를 만들 때 데이터 정렬을 지정할 수 있습니다. 인덱스는 지정된 순서로 문서를 저장하므로 쿼리 중 인메모리 정렬이 필요 없습니다. 인덱스를 사용하려면 작업은 인덱스에 지정된 데이터 정렬과 동일한 데이터 정렬을 사용하고 해당 인덱스에 포함되어야 합니다.

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

IndexOptions idxOptions = new IndexOptions();
idxOptions.collation(Collation.builder().locale("en_US").build());
Mono.from(itemsCollection.createIndex(
Indexes.ascending("name"), idxOptions)).block();

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

List<Document> indexes = Flux.from(itemsCollection.listIndexes())
.collectList().block();
if (indexes != null) {
indexes.forEach(idx -> System.out.println(idx.toJson()));
}

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

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

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

FindPublisher<Document> indexPublisher = itemsCollection.find()
.collation(Collation.builder().locale("en_US").build())
.sort(Sorts.ascending("name"));
Flux.from(indexPublisher)
.doOnNext(doc -> System.out.println(doc.toJson()))
.blockLast();

지원되는 작업에 새로운 데이터 정렬을 전달하여 기본 데이터 정렬을 재정의할 수 있습니다. 하지만 인덱스가 없으면 쿼리가 메모리 정렬을 수행하므로 인덱스 데이터 정렬을 사용하는 것보다 느립니다. 인덱스로 보호되지 않는 정렬 작업의 단점에 대한 자세한 내용은 MongoDB Server 수동에서 인덱스를 사용하여 쿼리 결과 정렬 을 참조하십시오.

다음 예시는 다음과 같은 특성을 가진 쿼리 작업을 보여줍니다.

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

  • 쿼리에서는 아이슬란드어("is") 데이터 정렬을 지정합니다. 이것이 인덱스 데이터 정렬과 다르므로 쿼리는 인덱스를 사용하지 않고 대신 메모리에서 정렬을 수행합니다.

FindPublisher<Document> customPublisher = itemsCollection.find()
.collation(Collation.builder().locale("is").build())
.sort(Sorts.ascending("name"));
Flux.from(customPublisher)
.doOnNext(doc -> System.out.println(doc.toJson()))
.blockLast();

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

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

데이터 정렬 옵션
설명

국가 및 언어 설정

필수 사항. 언어 및 변형에 대한 ICU 국가 및 언어 설정 코드입니다.
국가 및 언어 설정()

이전

string 끝부터 단어 부호를 고려할지 여부를 지정합니다.
backwards()

대소문자 구분

대소문자를 다른 값으로 간주할 지 여부를 지정합니다.
caseLevel()

대체

공백 및 구두점 고려 여부를 지정합니다.
collationAlternate()

caseFirst

대문자와 소문자 중 어느 것을 먼저 고려할지 지정합니다.
collationCaseFirst()

최대 변수

공백이나 공백과 구두점 모두를 무시할지 지정합니다. 이 설정은 대체 설정이 "shifted"인 경우에만 유효합니다.
collationMaxVariable()

강도

ICU 비교 수준을 지정합니다. 기본값은 "tertiary"입니다. 각 수준에 대한 자세한 내용은 ICU 비교 수준을 참조하세요.
collationStrength()

정규화

필요한 경우 문자열에 대해 유니코드 정규화를 수행할지 여부를 지정합니다. 유니코드 정규화에 대한 자세한 내용은 유니코드 정규화 형식를 참조하세요.
정규화()

numericOrdering

데이터 정렬 순서가 아닌 숫자 값에 따라 숫자를 접렬할지 여부를 지정합니다.
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();

해당 메서드 및 매개 변수에 대한 자세한 내용은 데이터 정렬.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" 변경에서는 오르차순 정렬에서 우말라우트가 있는 문자가 우말라우트가 없는 동일한 문자보다 먼저 정렬됩니다.

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

FindPublisher<Document> findPublisher = phonebookCollection.find()
.collation(Collation.builder()
.locale("de@collation=phonebook").build())
.sort(Sorts.ascending("first_name"));
Flux.from(findPublisher)
.doOnNext(doc -> System.out.println(doc.toJson()))
.blockLast();

예시 컬렉션 에서 이 작업을 수행하면 출력은 다음과 유사합니다.

{"_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 문서를 참조하세요.

다음 예시는 findOneAndUpdate() 작업에서 FindOneAndUpdateOptions 객체를 인스턴스화하고 매개변수로 전달하여 데이터 정렬을 지정합니다. 이 예시는 다음 작업을 수행합니다.

  • 예시 컬렉션 에서 오름차순으로 "Gunter" 앞에 오는 첫 번째 문서를 조회합니다.

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

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

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

Document updatedDoc = Mono.from(
phonebookCollection.findOneAndUpdate(
Filters.lt("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)))
.block();
if (updatedDoc != null) {
System.out.println("Updated document: " + updatedDoc.toJson());
}

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

Updated document: {"_id": 3, "first_name": "Günter", "verified": true}

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

다음 예시는 FindOneAndDeleteOptions 객체를 인스턴스화하고 매개 변수로 전달하여 findOneAndDelete() 작업에서 숫자 정렬 데이터 정렬을 지정합니다. 컬렉션에는 다음 문서가 포함되어 있습니다.

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

데이터 정렬은 locale 옵션을 "en" 로 설정하고 numericOrdering 옵션을 "true"로 설정하여 문자열을 수치값을 기준으로 정렬합니다.

Document deletedDoc = Mono.from(
numericalCollection.findOneAndDelete(
Filters.gt("a", "100"),
new FindOneAndDeleteOptions()
.collation(Collation.builder()
.locale("en")
.numericOrdering(true)
.build())
.sort(Sorts.ascending("a"))))
.block();
if (deletedDoc != null) {
System.out.println("Deleted document: " + deletedDoc.toJson());
}

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

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

string "179"의 숫자 값이 100보다 큽니다. 따라서 앞의 문서가 유일하게 일치합니다. 숫자 순서가 없으면 이진 데이터 정렬은 "16", "84", "179" 보다 "100"를 먼저 정렬합니다. 따라서 필터가 모든 문서와 일치합니다.

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

다음 예시는 집계 작업에서 데이터 정렬을 지정하는 방법을 보여줍니다. 집계를 수행하려면 MongoCollection 객체에서 aggregate() 메서드를 호출합니다.

집계 작업에 대한 데이터 정렬을 지정하려면 집계 작업에서 반환된 AggregatePublisher 에서 collation() 메서드를 호출합니다. 파이프라인에 정렬 집계 단계를 지정하여 데이터 정렬을 적용합니다.

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

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

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

  • 출력 문서의 _id 필드에 대한 오름차순 정렬입니다.

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

Bson groupStage = Aggregates.group(
"$first_name", Accumulators.sum("nameCount", 1));
Bson sortStage = Aggregates.sort(Sorts.ascending("_id"));
AggregatePublisher<Document> aggregatePublisher =
phonebookCollection
.aggregate(Arrays.asList(groupStage, sortStage))
.collation(Collation.builder()
.locale("de")
.collationStrength(CollationStrength.PRIMARY)
.build());
Flux.from(aggregatePublisher)
.doOnNext(doc -> System.out.println(doc.toJson()))
.blockLast();

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

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

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