照合
項目一覧
Overview
このガイドでは、照合を使用して、検索または集計操作の結果を string 値で並べ替える方法を説明します。 照合は、特定の言語とロケールに対応する文字の順序付け規則のセットである。
このガイドには、次のセクションが含まれています。
MongoDB 照合では、MongoDB がデフォルトの照合とカスタム照合に基づいて string 値をソートする方法について説明します。
「照合の指定」では、
Collation
構造体インスタンスの作成方法について説明しています。コレクションに照合を設定すると、新しいコレクションの照合を設定する方法について説明します
「インデックスに照合を設定する」では、インデックスの照合を設定する方法について説明します。
「操作に照合を設定する」では、特定の CRUD 操作に照合を適用する方法について説明します。
追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します
MongoDB 照合
MongoDB はデフォルトでバイナリ照合を使用して string をソートします。 この照合メソッドでは、ASCII 標準文字値を使用して string を比較して順序付けます。 特定の言語とロケールには、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 | 説明 |
---|---|---|
locale() (Required) | 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 toCollationAlternate::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); }
{ "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ドキュメントを参照してください。