照合
照合順序を指定すると、大文字や小文字、アクセント記号など、文字列を比較するための言語独自のルールを指定できます。
コレクションまたはビュー、インデックス、または照合をサポートする特定の操作の照合順序を指定できます。
MongoDB Atlas UI でドキュメントに対してクエリを実行するときに照合を指定するには、 「照合の指定」 を参照してください。
照合ドキュメント
照合ドキュメントには、次のフィールドがあります。
{ locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> }
照合を指定する場合、 locale
フィールドは必須です。その他の照合フィールドはすべてオプションです。 フィールドの説明については、 「照合ドキュメント」 を参照してください。
デフォルトの照合パラメータ値は、指定するロケールによって異なります。 デフォルトの照合パラメータとそれに関連するロケールの完全なリストについては、「 照合のデフォルト パラメータ 」を参照してください。
フィールド | タイプ | 説明 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| string | ICU のロケールです。サポート対象のロケールのリストについては、「サポートされている言語とロケール」を参照してください。 単純なバイナリ比較を指定するには、 | ||||||||||||
| integer | 任意。実行する比較のレベルです。ICU 比較レベルに対応しています。可能な値は次のとおりです。
詳細については、「ICU照合:比較レベル」を参照してください。 | ||||||||||||
| ブール値 | 任意。
詳細については、「ICU 照合: ケース レベル」を参照してください。 | ||||||||||||
| string | 任意。三次レベルの比較中に、大文字と小文字の相違のソート順序を決定するフィールドです。 可能な値は次のとおりです。
| ||||||||||||
| ブール値 | 任意。数字の文字列を数値として比較するか、文字列として比較するかを決定するフラグです。
デフォルトは、 | ||||||||||||
| string | 任意。照合で、空白と句読点を比較目的の基本文字として考慮するかどうかを決定するフィールドです。 可能な値は次のとおりです。
「 ICU照合:比較レベル 」を参照してください。 詳しくは、 を参照してください。 デフォルトは、 | ||||||||||||
| string | 任意。 可能な値は次のとおりです。
| ||||||||||||
| ブール値 | 任意。発音区別符号付きの文字列を、文字列の後ろからソートするかどうかを決定するフラグです(フランス語の辞書の順序など)。
デフォルト値は | ||||||||||||
| ブール値 | 任意。テキストに正規化が必要かどうかを確認し、正規化を実行するかどうかを決定するフラグです。一般的に、テキストの大部分はこの正規化プロセシングを必要としません。
デフォルト値は https://unicode-org.github.io/icu/userguide/collation/concesss.html# Normalization を参照してください 詳細については、「 」を参照してください。 |
照合をサポートする操作
次の操作の照合順序を指定できます。
注意
1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。
コマンド | mongosh メソッド |
---|---|
| |
|
[1] | (1, 2) 一部のインデックスの種類では、照合はサポートされていません。詳細については、「照合とサポートされていないインデックス タイプ」を参照してください。 |
動作
ローカル バリアント
一部の照合ロケールには、言語固有の特別なルールを使用するバリアントがあります。ロケール バリアントを指定するには、次の構文を使用します。
{ "locale" : "<locale code>@collation=<variant>" }
たとえば、中国語照合の unihan
バリアントを使用するには、次のようにします。
{ "locale" : "zh@collation=unihan" }
すべての照合ロケールとそのバリエーションの完全なリストについては、「照合ロケール」を参照してください。
照合とビュー
ビューの作成時にデフォルトの照合を指定できます。照合順序が指定されていない場合、ビューのデフォルトの照合は "simple" バイナリ比較照合子です。つまり、ビューはコレクションのデフォルトの照合を継承しません。
ビューでの文字列比較では、ビューのデフォルトの照合方法が使用されます。ビューのデフォルトの照合方法を変更または上書きしようとする操作は、エラーとなり、失敗します。
別のビューからビューを作成する場合、ソース ビューの照合方法と異なる照合方法を指定することはできません。
複数のビューが関わる集計(
$lookup
や$graphLookup
など)が実行される場合、それらのビューには同じ照合が含まれる必要があります。
照合とインデックスの使用
文字列の比較にインデックスを使用するには、操作で同じ照合も指定する必要があります。つまり、照合順序を持つインデックスでは、操作で異なる照合順序が指定されている場合、インデックス付きフィールドで文字列比較を実行する操作をサポートできません。
警告
照合が構成されたインデックスは、並べ替え順序を実現するために ICU 照合キーを使用するため、照合対応のインデックス キーは、照合のないインデックスのインデックス キーよりも大きくなる可能性があります。
たとえば、コレクション myColl
には、照合ロケール "fr"
を持つ文字列フィールド category
のインデックスがあります。
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
インデックスと同じ照合を指定する次のクエリ操作では、インデックスを使用できます。
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
ただし、デフォルトで「シンプル」なバイナリー コレータを使用する次のクエリ操作では、インデックスを使用できません。
db.myColl.find( { category: "cafe" } )
インデックス プレフィックスキーが文字列、配列、および埋め込みドキュメントではない複合インデックスの場合でも、異なる照合を指定する操作では、インデックスを使用してインデックス プレフィックスキーの比較をサポートできます。
たとえば、myColl
コレクションには、数値フィールドの score
、price
、および 文字列フィールドの category
の複合インデックスがあります。このインデックスは、文字列比較用の照合ロケール "fr"
を使用して作成されます。
db.myColl.createIndex( { score: 1, price: 1, category: 1 }, { collation: { locale: "fr" } } )
文字列の比較に "simple"
バイナリ照合を使用する次の操作では、インデックスを使用できます。
db.myColl.find( { score: 5 } ).sort( { price: 1 } ) db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
次の操作では、"simple"
バイナリ照合を使用してインデックス付きの category
フィールドで文字列を比較しますが、クエリの score: 5
部分の実行についてはインデックスが使用できます。
db.myColl.find( { score: 5, category: "cafe" } )
重要
ドキュメント キーとの照合(埋め込みドキュメントのキーを含む)では、単純なバイナリ比較が使用されます。つまり、"foo.bár" のようなキーのクエリは、strength パラメータに設定した値に関係なく、キー "foo.bar" と一致しません。
照合とサポートされていないインデックスの種類
次のインデックスは単純なバイナリ比較のみをサポートしており、照合はサポートしていません。
Tip
単純ではない照合順序を持つコレクションに text
または 2d
インデックスを作成するには、インデックスの作成時、明確に {collation:
{locale: "simple"} }
を指定する必要があります。
制限事項
numericOrdering
numericOrdering
を true
と指定する場合、以下の制限が適用されます。
比較では、連続する負でない整数のサブストリングのみが考慮されます。
numericOrdering
は、以下をサポートしません。+
-
小数点記号(小数点や小数点カンマなど)
指数
数値または 10 進数(ND)カテゴリの Unicode コード ポイントだけが数字として扱われます。
数字の長さが 254 文字を超える場合、超過文字は別の数字として扱われます。
次の文字列の数値および 10 進数値を含むコレクションを検討します。
db.c.insertMany( [ { "n" : "1" }, { "n" : "2" }, { "n" : "2.1" }, { "n" : "-2.1" }, { "n" : "2.2" }, { "n" : "2.10" }, { "n" : "2.20" }, { "n" : "-10" }, { "n" : "10" }, { "n" : "20" }, { "n" : "20.1" } ] )
次の find
クエリは、numericOrdering
パラメータを含む照合ドキュメントを使用します。
db.c.find( { }, { _id: 0 } ).sort( { n: 1 } ).collation( { locale: 'en_US', numericOrdering: true } )
この操作は次の結果を返します。
[ { n: '-2.1' }, { n: '-10' }, { n: '1' }, { n: '2' }, { n: '2.1' }, { n: '2.2' }, { n: '2.10' }, { n: '2.20' }, { n: '10' }, { n: '20' }, { n: '20.1' } ]
numericOrdering: true
の場合、文字列値を数値のように昇順でソートします。2 つの負の値
-2.1
と-10
は、サポート対象外の-
の文字が使われているため、期待どおりのソート順序でソートされません。numericOrdering
パラメータは 10 進数をサポートしていないため、値2.2
は値2.10
より前にソートされます。その結果、
2.2
と2.10
は辞書順にソートされます。