校对

自版本 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