MongoDBの大文字と小文字を区別しないインデックスを作成する方法
この投稿では、バージョン3.4でMongoDBによってリリースされた新機能であるCollationsを使用して、MongoDBで大文字と小文字を区別しないインデックスを作成する方法を紹介します。
大文字と小文字を区別しないインデックスとは何ですか?
大文字と小文字を区別しないインデックスは、大文字と小文字を区別せずに文字列比較を実行するクエリをサポートし、MongoDB 3.4の照合サポートにより、これらを構築できるようになりました。照合により、文字列比較のための言語固有のルールを指定できます。 MongoDBの以前のバージョンは照合をサポートしていなかったため、大文字と小文字を区別するインデックス比較の実行に制限されていました。大文字と小文字を区別しない動作が必要なシナリオでは、すべての文字列を大文字または小文字に変換/保存してから比較するしかありませんでした。ご想像のとおり、これによりクエリやインデックス操作が非常に面倒になります。
Collationプロパティは、コレクションレベルで設定することも、インデックスを作成するときに明示的に設定することもできます。
-
コレクションレベルで照合プロパティを設定します
コレクションレベルで設定されている場合、インデックスはコレクションの照合を継承するため、すべてのcreate-indexコマンドで指定する必要はありません。 。作成時に明示的に指定されていない限り、コレクションには照合が関連付けられていません。以下のコマンドを使用して、コレクションの照合の詳細を確認できます。
>db.createCollection("test") >db.getCollectionInfos({name: test'}); [ { "name" : "test", "type" : "collection", "options" : { }, "info" : { "readOnly" : false }, "idIndex" : { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" } } ]
-
インデックスを作成するときに照合プロパティを設定します
コレクションを作成するときに照合を明示的に指定する方法は次のとおりです。
>db.createCollection("test2", { collation: { locale: 'en_US', strength: 2 } } ); >db.getCollectionInfos({name: 'test2'}) [ { "name" : "test2", "type" : "collection", "options" : { "collation" : { "locale" : "en_US", "caseLevel" : false, "caseFirst" : "off", "strength" : 2, "numericOrdering" : false, "alternate" : "non-ignorable", "maxVariable" : "punct", "normalization" : false, "backwards" : false, "version" : "57.1" } }, "info" : { "readOnly" : false }, "idIndex" : { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test2", "collation" : { "locale" : "en_US", "caseLevel" : false, "caseFirst" : "off", "strength" : 2, "numericOrdering" : false, "alternate" : "non-ignorable", "maxVariable" : "punct", "normalization" : false, "backwards" : false, "version" : "57.1" } } } ]
-
インデックスの作成中に照合プロパティを設定します
インデックスの作成中に、インデックスの照合を明示的に設定するオプションもあります。たとえば、ロケールが「en」で強度が2のテストコレクションのnameプロパティに「index」を追加します:
>db.test.createIndex( { name: 1}, { collation: { locale: 'en', strength: 2 } })
-
照合を使用してクエリを実行する方法
Collationで作成されたインデックスを使用するには、クエリ時にCollationプロパティを指定する必要があります:
db.test.find({name:'blah'})
MongoDBで照合を使用して大文字と小文字を区別しないインデックスをクエリする方法クリックしてツイート
-
クエリで照合を指定する
Collationが指定されていないため、このクエリは上記で指定されたインデックスを使用しません。照合を活用するには、クエリで明示的に指定する必要があります:
db.test.find({name:'blah'}).collation({ locale: 'en', strength: 2 })
コレクションにデフォルトの照合がある場合でも、クエリで照合を指定する必要があります。それ以外の場合、MongoDBは特定のインデックスを使用しません:
-
古いバージョンのMongoDB(3.2.x)からアップグレードする場合の照合
古いバージョンのMongoDB(3.2.xなど)からアップグレードする場合、既存のインデックスは照合をサポートしません。 Collationを稼働させるための最初のステップは、3.4.xのすべての新機能がオンになっていることを確認することです。
db.adminCommand( { setFeatureCompatibilityVersion: "3.4" } )
#MongoDBバージョンをアップグレードして、CollationClickを使用して大文字と小文字を区別しないインデックスを作成します非互換性の詳細については、MongoDB3.xリリースノートをご覧ください。これらの手順を実行すると、3.2にダウングレードするのが難しくなることに注意してください。次のステップは、インデックスのバージョンを確認することです。
3.4互換性にアップグレードしたら、前に概説した手順に従って新しいインデックスを作成できます。大きなインデックスを作成する場合は、ScaleGridローリングインデックス作成ジョブを使用してインデックスを追加してください。