照合

バージョン 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)
1Collation を作成するにはロケールが必要です。これは、ロケールの文字列表現、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));
MongoDB は、照合順序が指定されていない場合 (Collation.simple())、単純なバイナリ比較を使用します。

次の 2 つの例に示すように、コレクション操作で照合順序を使用するには、クエリまたは操作オプションで 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 をサポートします。