校对
自版本 3.4 起,MongoDB 支持针对集合和索引创建以及各种查询操作的校对。校对基于 ICU 校对 定义字符串比较规则。校对文档包含各种封装在 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 自动创建时,不会使用带注释的校对。这需要额外的存储交互,从而延迟整个过程。请在这些情况下使用 MongoOperations.createCollection 。
|
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));
如果未指定校对(Collation.simple() ),MongoDB 将使用简单的二进制比较。
|
在集合操作中使用校对涉及在查询或操作选项中指定 Collation
实例,如下面两个示例所示
示例 1. 在
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);
示例 2. 在
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 存储库通过 @Query
注释的 collation
属性支持 Collations
。