데이터 정렬.
이 페이지의 내용
개요
이 가이드에서는 데이터 정렬 을 사용하여 string 값을 기준으로 쿼리 또는 애그리게이션 작업 결과를 정렬하는 방법을 배울 수 있습니다. 데이터 정렬은 특정 언어 및 국가 및 언어 설정에 적용되는 문자 순서 지정 규칙의 집합입니다.
MongoDB의 데이터 정렬
MongoDB 는 기본값 바이너리 데이터 정렬을 사용하여 문자열을 정렬합니다. 이 데이터 정렬 메서드는 ASCII 표준 문자 값을 사용하여 문자열을 비교하고 정렬합니다. 특정 언어 및 국가 및 언어 설정에는 ASCII 표준과 다른 특정 문자 순서 규칙이 있습니다.
예를 들어, 캐나다 프랑스어에서는 다른 문자가 동일한 경우 가장 오른쪽에 악센트가 있는 문자가 문자열의 순서를 결정합니다. 다음 캐나다 프랑스어 단어를 고려하세요.
코트
coté
côte
côté
기본 바이너리 데이터 정렬을 사용할 때 MongoDB는 다음과 같은 순서로 정렬합니다.
cote coté côte côté
캐나다 프랑스어 데이터 정렬을 사용할 때 MongoDB는 다음과 같은 순서로 정렬합니다.
cote côte coté côté
데이터 정렬 지정
데이터 정렬을 지정하려면 Collation
객체를 만듭니다. Collation
객체의 Locale
필드를 정의해야 합니다. 다른 모든 필드는 선택 사항입니다. 예를 들어 다음 코드 예제에서는 "en_US"
국가 및 언어 설정 데이터 정렬을 사용하여 Collation
객체를 지정합니다.
myCollation := &options.Collation{Locale: "en_US"}
객체 필드의 전체 목록은 데이터 정렬 Collation
API 문서 를 참조하세요. . 지원되는 모든 국가 및 언어 설정과 Locale
필드의 기본값을 보려면 지원되는 언어 및 국가 및 언어 설정을 방문하세요.
collection 또는 뷰에서 데이터 정렬 설정
새 컬렉션 또는 뷰를 만들 때 데이터 정렬을 적용할 수 있습니다. 이는 해당 컬렉션 또는 뷰에서 호출되는 모든 작업에 대한 기본 데이터 정렬을 정의합니다. CreateCollectionOptions
또는 CreateViewOptions
객체를 통해 데이터 정렬을 설정합니다. 그런 다음 옵션 객체를 인수로 사용하여 CreateCollection()
또는 CreateView()
메서드를 호출합니다.
컬렉션 예제 만들기
다음 예제에서는 books
라는 새 컬렉션을 만들고 "fr"
국가 및 언어 설정을 사용하여 기본 데이터 정렬을 지정합니다. Strength
데이터 정렬 필드의 값은 1
로, 문자 악센트의 차이를 무시합니다.
myCollation := &options.Collation{Locale: "fr", Strength: 1} opts := options.CreateCollection().SetCollation(myCollation) err := db.CreateCollection(context.TODO(), "books", opts) if err != nil { panic(err) }
기본 데이터 정렬 예제 사용
books
컬렉션에서 데이터 정렬을 사용하는 작업을 호출하는 경우 작업은 컬렉션 만들기 예제에 지정된 기본 데이터 정렬을 사용합니다.
books
컬렉션에 다음 문서가 포함되어 있다고 가정합니다.
{"name" : "Emma", "length" : "474"} {"name" : "Les Misérables", "length": "1462"} {"name" : "Infinite Jest", "length" : "1104"} {"name" : "Cryptonomicon", "length" : "918"} {"name" : "Ça", "length" : "1138"}
참고
문서를 삽입하는 방법을 학습 보려면 문서 삽입을 참조하세요.
다음 예제에서는 Find()
메서드를 사용하여 알파벳순으로 "Infinite Jest"
name
값이 있는 모든 문서를 반환합니다.
filter := bson.D{{"name", bson.D{{"$lt", "Infinite Jest"}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"name":"Emma","length":"474"} {"name":"Cryptonomicon","length":"918"} {"name":"Ça","length":"1138"}
기본 데이터 books
정렬을 Find()
name
지정하지 않으면 메서드는 기본 바이너리 데이터 정렬 규칙에 따라 앞에 오는 값을 "Infinite Jest"
결정합니다. 이 규칙은 "I"로 시작하는 단어 뒤에 "Ç"로 시작하는 단어를 배치합니다. 출력은 다음과 유사합니다.
{"name":"Emma","length":"474"} {"name":"Cryptonomicon","length":"918"}
Find()
메서드에 대해 자세히 알아보려면 데이터 조회를 참조하세요.
인덱스에 데이터 정렬 설정
컬렉션에 새 인덱스를 만들 때 데이터 정렬을 적용할 수 있습니다. 인덱스는 컬렉션에 문서의 순서가 지정된 표현을 저장하므로 MongoDB 인스턴스는 메모리 내 정렬 작업에 대한 순서를 수행하지 않습니다.
작업에서 인덱스를 사용하려면 작업에서 인덱스에 지정된 데이터 정렬과 동일한 데이터 정렬을 사용해야 합니다. 또한 작업이 데이터 정렬이 포함된 인덱스에 포함되는지 확인합니다. IndexOptions
객체를 통해 데이터 정렬을 설정하고 이 객체를 CreateOne()
메서드에 인수로 전달합니다.
예시
컬렉션 만들기 예제 섹션에 표시된 대로 books
컬렉션을 만들고 기본 데이터 정렬을 적용한 후에는 컬렉션의 기본 데이터 정렬을 변경할 수 없습니다. 그러나 다른 데이터 정렬을 사용하여 컬렉션에 대한 인덱스를 만들 수 있습니다.
다음 예제에서는 CreateOne()
메서드를 사용하여 name
필드에 오름차순 인덱스를 만들고 "en_US"
국가 및 언어 설정으로 새 데이터 정렬을 지정합니다.
myCollation := &options.Collation{Locale: "en_US"} opts := options.Index().SetCollation(myCollation) indexModel := mongo.IndexModel{ Keys: bson.D{{"name", 1}}, Options: opts, } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Name of Index Created: name_1
작업에 데이터 정렬 설정
컬렉션에서 문서를 읽고, 업데이트하고, 삭제하는 작업에는 데이터 정렬을 사용할 수 있습니다. 작업에 데이터 정렬을 적용하면 이전에 컬렉션에 대해 정의된 기본 데이터 정렬이 재정의됩니다.
인덱스의 데이터 정렬과 다른 작업에 새 데이터 정렬을 적용하는 경우 해당 인덱스를 사용할 수 없습니다. 결과적으로 작업이 인덱스에 포함되는 작업만큼 제대로 수행되지 않을 수 있습니다. 인덱스에 포함되지 않는 정렬 작업의 단점에 대한 자세한 내용은 인덱스를 사용하여 쿼리 결과 정렬을 참조하세요. 데이터 정렬을 지원하는 작업 목록은 MongoDB 매뉴얼 을 참조하세요.
예시
데이터 정렬을 지원하는 작업을 사용하여 books
컬렉션의 문서를 업데이트하고 쿼리할 수 있습니다.
다음 예제에서는 Find()
메서드를 사용하여 length
값이 "1000"
보다 큰 문서를 반환합니다. NumericOrdering
데이터 정렬 필드의 값은 true
로, 값이 알파벳 순서가 아닌 숫자 순서로 정렬되도록 합니다.
filter := bson.D{{"length", bson.D{{"$gt", "1000"}}}} myCollation := &options.Collation{Locale: "en_US", NumericOrdering: true} opts := options.Find().SetCollation(myCollation) cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { panic(err) } var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"name":"Les Misérables","length":"1462"} {"name":"Infinite Jest","length":"1104"} {"name":"Ça","length":"1138"}
NumericOrdering
필드가 true
로 설정된 데이터 정렬을 지정하지 않고 동일한 Find()
작업은 length
값을 문자열로 비교합니다. 이 경우 출력은 다음과 유사합니다.
{"name":"Emma","length":"474"} {"name":"Les Misérables","length":"1462"} {""name":"Infinite Jest","length":"1104"} {"name":"Cryptonomicon","length":"918"} {"name":"Ça","length":"1138"}
추가 정보
Find()
메서드에 대해 자세히 알아보려면 데이터 조회 가이드를 참조하세요.
데이터 정렬에 대해 자세히 알아보려면 다음 매뉴얼 페이지를 참조하세요.
API 문서
이 가이드에서 설명하는 메서드에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.