Docs Menu
Docs Home
/ / /
Rust ドライバー
/

照合

項目一覧

  • Overview
  • MongoDB 照合
  • 照合の指定
  • コレクションでの照合の設定
  • 照合例を使用したコレクションの作成
  • 照合順序のデモンストレーション
  • インデックスでの照合の設定
  • 操作での照合の設定
  • 詳細情報
  • API ドキュメント

このガイドでは、照合を使用して、検索または集計操作の結果を string 値で並べ替える方法を説明します。 照合は、特定の言語とロケールに対応する文字の順序付け規則のセットである。

このガイドには、次のセクションが含まれています。

  • MongoDB 照合では、MongoDB がデフォルトの照合とカスタム照合に基づいて string 値をソートする方法について説明します。

  • 「照合の指定」では、 Collation構造体インスタンスの作成方法について説明しています。

  • コレクションに照合を設定すると、新しいコレクションの照合を設定する方法について説明します

  • 「インデックスに照合を設定する」では、インデックスの照合を設定する方法について説明します。

  • 「操作に照合を設定する」では、特定の CRUD 操作に照合を適用する方法について説明します。

  • 追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します

MongoDB はデフォルトでバイナリ照合を使用して string をソートします。 この照合メソッドでは、ASCII 標準文字値を使用して string を比較して順序付けます。 特定の言語とロケールには、ASCII 標準とは異なる特定の文字順序付け規則があります。

Tip

ASCII 基準の詳細については、 ASCII を参照してください Wikipedia のページ。

たとえば、カナダフランス語では、他の文字が同じ場合、string の順序を決定します。 次のカナダフランス語の単語について考えてみます。

  • コピー

  • coté

  • côte

  • côté

デフォルトのバイナリ照合を使用する場合、MongoDB は単語を次の順序でソートします。

cote
coté
côte
côté

このソート順序では、ASCII 標準では文字「o」が文字「」の前に配置されているため、「コテ」が「コテ」より前に配置されています。

カナダ フランス語の照合を使用する場合、MongoDB は単語を次の順序でソートします。

cote
côte
coté
côté

このソート順では、「connector 」が「cote」の後に配置されます。これは、カナダフランス語の照合ルールでは「e」が文字「ele」の前に配置されているためです。

照合を定義するには、 Collation構造体インスタンスで照合ロケールとその他のオプションを指定します。 Collationインスタンスの構築を開始するには、 Collation::builder()メソッドを呼び出します。

注意

構造体をインスタンス化する

Rust ドライバーは、 Collationを含む一部の構造体型を作成するためのビルダ設計パターンを実装します。 builder()メソッドを使用して、オプション ビルダー メソッドを連鎖させることで、各タイプのインスタンスを構築できます。

次の表では、 Collationインスタンスのフィールドを設定するために使用できるビルダ メソッドについて説明します。 有効なCollation構造体を構築するには、 locale()メソッドを使用する必要がありますが、他のビルダ メソッドはすべて任意です。

方式
Possible Values
説明
locale() (Required)
For a full list of supported locales, see
in the Server manual.
Specifies the ICU locale
strength()
CollationStrength::Primary, CollationStrength::Secondary, CollationStrength::Tertiary, CollationStrength::Quaternary, CollationStrength::Identical
実行する比較のレベルを指定します
case_level()
true, false
Specifies whether the driver performs case comparison
case_first()
CollationCaseFirst::Upper, CollationCaseFirst::Lower, CollationCaseFirst::Off
三次レベルの比較中に、大文字と小文字の相違のソート順序を指定します
numeric_ordering()
true, false
Specifies whether the driver compares numeric strings as numbers
alternate()
CollationAlternate::NonIgnorable, CollationAlternate::Shifted
ドライバーが string の比較中に空白と句読点を基本文字と見なすかどうかを指定します
max_variable()
CollationMaxVariable::Punct,
CollationMaxVariable::Space
Specifies which characters the driver ignores when alternate is set to
CollationAlternate::Shifted
normalization()
true, false
ドライバーが string 値のテキスト正規化を実行するかどうかを指定します
backwards()
true, false
Specifies whether the driver sorts strings containing diacritics in reverse character order

次の例では、 Collationインスタンスを指定し、照合ロケールを"en_US"に設定します。

let collation = Collation::builder()
.locale("en_US")
.build();

新しいコレクションを作成する際に、そのコレクションで呼び出される将来の操作の照合を定義できます。 照合を設定するには、 collation()関数をcreate_collection()メソッドに連結して、 Collationインスタンスをcollation()にパラメータとして渡します。

この例では、 "fr" (フランス語のロケール規則)に従って照合を指定し、その照合をbooksという新しいコレクションに適用します。 発音区別符号の違いを無視するには、 strengthフィールドはCollationStrength::Primaryに設定されます。

let collation = Collation::builder()
.locale("fr")
.strength(CollationStrength::Primary)
.build();
let result = my_db.create_collection("books")
.collation(collation)
.await?;

照合をサポートする操作を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" }

Tip

コレクションにドキュメントを挿入する方法については、「 ドキュメントの挿入 」ガイドを参照してください。

次の例では、 find()メソッドを使用して、 nameフィールドの値が"Infinite Jest"の後にアルファベット順に先行するすべてのドキュメントを返します。

let query = doc! { "name": doc! { "$lt": "Infinite Jest" } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{}", doc);
}

booksコレクションの照合を指定しない場合、 find()メソッドはデフォルトのバイナリ照合ルールに従って、 "Infinite Jest"に先行するname値を決定します。 これらのルールでは、"$" で始まる単語が、"I" で始まる単語の後に配置されます。 したがって、上記の検索操作がバイナリ照合ルールに従う場合、 name値が"Ça"であるドキュメントはフィルタ条件に一致しません。

コレクションに新しいインデックスを作成すると、インデックスによってカバーされる操作の照合を定義できます。 インデックスとその照合を使用する操作を実行するには、操作とインデックスで同じ照合を指定する必要があります。

Tip

インデックスとカバード クエリの詳細については、「インデックスガイド 」を参照してください。

collation()関数を使用してIndexOptionsインスタンスを構築し、インデックス照合を設定します。 次に、 IndexOptionsIndexModelビルダ関数の引数として渡し、 IndexModelcreate_index()メソッドの引数として渡します。

次の例では、 create_index()メソッドを使用してnameフィールドに昇順のインデックスを作成し、 "en_US"ロケールに対応する新しい照合を指定します。

let collation = Collation::builder()
.locale("en_US")
.build();
let index_opts = IndexOptions::builder()
.collation(collation)
.build();
let index = IndexModel::builder()
.keys(doc! { "name": 1 })
.options(index_opts)
.build();
let result = my_coll.create_index(index).await?;
println!("Created index: {}", result.index_name);

コレクションからドキュメントを読み取り、更新、削除する操作では、照合を使用できます。 操作に照合を適用すると、コレクションまたはインデックスに対して以前に定義された照合が上書きされます。

インデックスの照合とは異なる操作に照合を適用する場合、そのインデックスは使用できません。 その結果、操作は、インデックスによってカバーされる操作のように効率的に実行されない可能性があります。 インデックスで説明されていないソート操作の悪影響の詳細については、サーバー マニュアルの「インデックスを使用してクエリ結果をソートする」を参照してください。

この例では、次のアクションを実行します。

  • numeric_ordering照合オプションをtrueに設定します。これにより、値がアルファベット順ではなく番号順にソートされます。

  • find()メソッドを使用して、 lengthフィールドの値が"1000"より大きいドキュメントを返します

  • collation()メソッドをfind()メソッドに連結して照合を指定します。これにより、コレクションの照合は上書きされます。

let collation = Collation::builder()
.locale("en_US")
.numeric_ordering(true)
.build();
let filter = doc! { "length": doc! { "$gt": "1000" } };
let mut cursor = my_coll.find(filter)
.collation(collation)
.await?;
while let Some(result) = cursor.try_next().await? {
println!("{}", result);
};

numeric_orderingオプションをtrueに設定せずに前述の検索操作を実行すると、ドライバーはlengthの値を string として比較し、 "474""918"の値の前に string の値"1000"を並べ替えます。 この場合、上記の検索操作ではbooksコレクション内のすべてのドキュメントが返されます。

find()メソッドの詳細については、「データの取得」ガイドを参照してください。

照合の詳細については、次のサーバー マニュアル ページを参照してください。

このガイドで言及されているメソッドや型の詳細については、以下のAPIドキュメントを参照してください。

戻る

接続プールの監視