Collations
自 3.4 版以来,MongoDB 支持针对集合和索引创建以及各种查询操作的排序规则。排序规则根据 ICU collations 定义字符串比较规则。排序规则文档由 Collation
中封装的各种属性组成,如下面的列表所示:
Collation collation = Collation.of("fr") 1
.strength(ComparisonLevel.secondary() 2
.includeCase())
.numericOrderingEnabled() 3
.alternate(Alternate.shifted().punct()) 4
.forwardDiacriticSort() 5
.normalizationEnabled(); 6
1 | Collation 需要一个语言环境才能创建。它可以是语言环境的字符串表示、Locale (考虑语言、国家/地区和变体)或 CollationLocale 。语言环境是创建所必需的。 |
2 | 校对强度定义表示字符差异的比较级别。根据所选择的强度,你可以配置各种选项(区分大小写、大小写顺序等等)。 |
3 | 指定以数字还是字符串的形式比较数字字符串。 |
4 | 指定校对是否应将空格和标点符号视为比较的基本字符。 |
5 | 指定带变音符号的字符串是否按照从字符串末尾开始的顺序进行排序,例如一些法语词典中的顺序。 |
6 | 指定是否检查文本是否需要规范化,以及是否执行规范化。 |
排序规则可用于创建集合和索引。如果创建指定排序规则的集合,则该集合将应用于索引创建和查询,除非你指定了不同的排序规则。排序规则对于整个操作有效,不能按字段指定。
与其他元数据一样,排序规则可以通过 @Document
注释的 collation
属性从域类型派生,并在运行查询、创建集合或索引时直接应用。
当 MongoDB 在首次交互时自动创建集合时,不会使用带注释的排序规则。这需要额外的存储交互,从而延迟了整个过程。请在这些情况下使用 |
Collation french = Collation.of("fr");
Collation german = Collation.of("de");
template.createCollection(Person.class, CollectionOptions.just(collation));
template.indexOps(Person.class).ensureIndex(new Index("name", Direction.ASC).collation(german));
如果没有指定排序规则,MongoDB 将使用简单的二进制比较( |
对集合操作使用排序涉及在查询或操作选项中指定 Collation
实例,如下例所示:
Example 1. Using collation with
find
Collation collation = Collation.of("de");
Query query = new Query(Criteria.where("firstName").is("Amél")).collation(collation);
List<Person> results = template.find(query, Person.class);
Example 2. Using collation with
aggregate
Collation collation = Collation.of("de");
AggregationOptions options = AggregationOptions.builder().collation(collation).build();
Aggregation aggregation = newAggregation(
project("tags"),
unwind("tags"),
group("tags")
.count().as("count")
).withOptions(options);
AggregationResults<TagCount> results = template.aggregate(aggregation, "tags", TagCount.class);
仅当用于操作的排序规则与索引排序规则匹配时,才会使用索引。
MongoDB Repositories 通过 @Query
注释的 collation
属性支持 Collations
。