Overview
このガイドでは、照合を使用して、検索または集計操作の結果を string 値で並べ替える方法を説明します。 照合は、特定の言語とロケールに対応する文字の順序付け規則のセットである。
このガイドには、次のセクションが含まれています。
MongoDB 照合では、MongoDB がデフォルトの照合とカスタム照合に基づいて string 値をソートする方法について説明します。
「照合の指定」では
Collation構造体インスタンスの作成方法を説明しますコレクションに照合を設定すると、新しいコレクションの照合を設定する方法について説明します
「インデックスに照合を設定する」では、インデックスの照合を設定する方法について説明します。
「操作に照合を設定する」では、特定の CRUD 操作に照合を適用する方法について説明します。
追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します
MongoDB 照合
MongoDB はデフォルトでバイナリ照合を使用して string をソートします。 この照合メソッドでは、ASCII 標準文字値を使用して string を比較して順序付けます。 特定の言語とロケールには、ASCII 標準とは異なる特定の文字順序付け規則があります。
Tip
ASCII 標準の詳細については、Wikipedia の ASCII ページを参照してください。
たとえば、カナダフランス語では、他の文字が同じ場合、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 | 説明 |
|---|---|---|
| サポートされているロケールの全体のリストについては、サーバーマニュアルの | ICU のロケールを指定します |
|
| 実行する比較のレベルを指定します |
|
| ドライバーが大文字と小文字の比較を実行するかどうかを指定します |
|
| 三次レベルの比較中に、大文字と小文字の相違のソート順序を指定します |
|
| ドライバーが数字の string を数値として比較するかどうかを指定します |
|
| ドライバーが string の比較中に空白と句読点を基本文字と見なすかどうかを指定します |
|
|
|
|
| ドライバーが string 値のテキスト正規化を実行するかどうかを指定します |
|
| ドライバーが発音区別符号を含む string を逆の文字順でソートするかどうかを指定します |
例
次の例では、 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); }
{ "name": "Emma", "length": 474 } { "name": "Cryptonomicon", "length": 918 } { "name" : "Ça", "length" : "1138" }
booksコレクションの照合を指定しない場合、 find()メソッドはデフォルトのバイナリ照合ルールに従って、 "Infinite Jest"に先行するname値を決定します。 これらのルールでは、"$" で始まる単語が、"I" で始まる単語の後に配置されます。 したがって、上記の検索操作がバイナリ照合ルールに従う場合、 name値が"Ça"であるドキュメントはフィルタ条件に一致しません。
インデックスでの照合の設定
コレクションに新しいインデックスを作成すると、インデックスによってカバーされる操作の照合を定義できます。 インデックスとその照合を使用する操作を実行するには、操作とインデックスで同じ照合を指定する必要があります。
Tip
インデックスとカバード クエリの詳細については、「インデックスガイド 」を参照してください。
collation()関数を使用してIndexOptionsインスタンスを構築し、インデックス照合を設定します。 次に、 IndexOptionsをIndexModelビルダ関数の引数として渡し、 IndexModelをcreate_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);
Created index: name_1
操作での照合の設定
コレクションからドキュメントを読み取り、更新、削除する操作では、照合を使用できます。 操作に照合を適用すると、コレクションまたはインデックスに対して以前に定義された照合が上書きされます。
インデックスの照合とは異なる操作に照合を適用する場合、そのインデックスは使用できません。 その結果、操作は、インデックスによってカバーされる操作のように効率的に実行されない可能性があります。 インデックスで説明されていないソート操作の悪影響の詳細については、サーバー マニュアルの「インデックスを使用してクエリ結果をソートする」を参照してください。
例
この例では、次のアクションを実行します。
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); };
{ "name" : "Les Misérables", "length": "1462" } { "name" : "Infinite Jest", "length" : "1104" } { "name" : "Ça", "length" : "1138" }
numeric_orderingオプションをtrueに設定せずに前述の検索操作を実行すると、ドライバーはlengthの値を string として比較し、 "474"と"918"の値の前に string の値"1000"を並べ替えます。 この場合、上記の検索操作ではbooksコレクション内のすべてのドキュメントが返されます。
詳細情報
find()メソッドについて詳しくは、 「 ドキュメント検索 」のガイドを参照してください。
照合の詳細については、次のサーバー マニュアル ページを参照してください。
API ドキュメント
このガイドで言及されているメソッドや型の詳細については、以下のAPIドキュメントを参照してください。