大文字と小文字を区別しないインデックス
大文字と小文字を区別しないインデックスは、大文字と小文字を区別せずにstring を比較するクエリをサポートします。 大文字と小文字の不区別は照合に由来します。
重要
大文字と小文字を区別しないインデックスでは、通常 $regex
クエリのパフォーマンスは向上しません。$regex
実装は照合順序に対応していないため、大文字と小文字を区別しないインデックスを効率的に使用することはできません。
コマンド構文
collation
オプションを指定すると、db.collection.createIndex()
で大文字と小文字を区別しないインデックスを作成できます。
db.collection.createIndex( { <field>: <sortOrder> }, { collation: { locale : <locale>, strength : < 1 | 2 > } } )
大文字と小文字を区別しないインデックスの照合を指定するには、 collation
オブジェクトに次のフィールドを含めます。
フィールド | 説明 |
---|---|
locale | 言語の規則を指定します。使用可能なロケールのリストについては、「サポートされている言語とロケール」を参照してください。 |
strength | 比較ルールを決定します。 strength 値が1または2の場合は、大文字と小文字を区別しない照合を示します。 |
その他の照合フィールドについては「照合」を参照してください。
動作
照合を指定するインデックスを使用するには、クエリ操作とソート操作でインデックスと同じ照合を指定する必要があります。コレクションで照合が定義されている場合、別の照合を明示的に指定しない限り、すべてのクエリとインデックスがその照合を継承します。
例
大文字と小文字を区別しないインデックスを作成する
デフォルトの照合がないコレクションで大文字と小文字を区別しないインデックスを使用するには、照合を指定してインデックスを作成し、strength
パラメーターを 1
または 2
に設定します(strength
パラメーターの説明については、「照合」 を参照してください)。インデックス レベルの照合を使用するには、クエリ レベルで同じ照合を指定する必要があります。
次の例では、デフォルトの照合なしでコレクションを作成し、大文字と小文字を区別しない照合で type
フィールドにインデックスを追加します。
db.createCollection("fruit") db.fruit.createIndex( { type: 1 }, { collation: { locale: 'en', strength: 2 } } )
インデックスを使用するには、クエリによって同じ照合を指定する必要があります。
db.fruit.insertMany( [ { type: "apple" }, { type: "Apple" }, { type: "APPLE" } ] ) db.fruit.find( { type: "apple" } ) // does not use index, finds one result db.fruit.find( { type: "apple" } ).collation( { locale: 'en', strength: 2 } ) // uses the index, finds three results db.fruit.find( { type: "apple" } ).collation( { locale: 'en', strength: 1 } ) // does not use the index, finds three results
デフォルトの照合順序を持つコレクションの大文字と小文字を区別しないインデックス
デフォルトの照合を使用してコレクションを作成すると、他の照合を指定しない限り、作成されするすべてのインデックスがその照合を継承します。別の照合が指定されていないクエリも、すべてデフォルトの照合を継承します。
次の例では、デフォルトの照合で names
というコレクションを作成し、first_name
フィールドにインデックスを作成します。
db.createCollection("names", { collation: { locale: 'en_US', strength: 2 } } ) db.names.createIndex( { first_name: 1 } ) // inherits the default collation
名前の小規模なコレクションを挿入します。
db.names.insertMany( [ { first_name: "Betsy" }, { first_name: "BETSY"}, { first_name: "betsy"} ] )
このコレクションのクエリは、デフォルトで指定された照合順序を使用し、可能であればインデックスも使用します。
db.names.find( { first_name: "betsy" } ) // inherits the default collation: { collation: { locale: 'en_US', strength: 2 } } // finds three results
上記の操作では、コレクションのデフォルトの照合順序を使用して、3 つのドキュメントすべてが検索されます。パフォーマンスを向上させるために、 first_name
フィールドのインデックスを使用します。
クエリで別の照合を指定すれば、このコレクションでも大文字と小文字を区別した検索を実行できます。
db.names.find( { first_name: "betsy" } ).collation( { locale: 'en_US' } ) // does not use the collection's default collation, finds one result
上記の操作で使用される照合には、strength
値の指定がないため、検索では 1 件のドキュメントしか見つかりません。コレクションのデフォルトの照合またはインデックスは使用されません。