配列値を含むフィールドにインデックスを作成すると、そのフィールドに対するクエリのパフォーマンスが向上します。 配列値を含むフィールドにインデックスを作成すると、MongoDB はそのインデックスをマルチキー インデックスとして保存します。
インデックスを作成するには、 db.collection.createIndex()メソッドを使用します。 操作は次のプロトタイプのようになります。
db.<collection>.createIndex( { <field>: <sortOrder> } )
このタスクについて
このページの例では、 sample_mflix データセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「 サンプル データセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
定期的にクエリを実行すると、1910 より前にリリースされ、Short ジャンルの映画が返されます。このクエリのパフォーマンスを向上させるには、genresフィールドにインデックスを作成します。
警告
MongoDB 9.0 以降では、フィールドを参照するクエリが実行中中にインデックス付きフィールドがマルチキーフィールドになると、そのクエリは QueryKilledError の付与で失敗する可能性があります。インデックスフィールドは、ドキュメントを挿入または更新して、フィールドに配列値を含むようにマルチキーになります。
このエラーでクエリが失敗した場合は、挿入または更新操作が完了した後にクエリを再実行してください。
手順
次の操作では、 moviesコレクションのgenresフィールドに昇順のマルチキー インデックスが作成されます。
db.movies.createIndex( { genres: 1 } )
genres_1
genresには配列値が含まれているため、MongoDB はこのインデックスをマルチキー インデックスとして保存します。
結果
インデックスには、 genresフィールドに表示される個々の値のキーが含まれています。例、ジャンル Crime と Drama を保存する映画 The Godfather の場合、インデックスには各ジャンルに対して 1 つのキーが含まれています。インデックスは昇順です。つまり、キーは昇順で保存されます。
インデックスは、 genresフィールドで を選択するクエリをサポートしています。例、次のクエリは、genres 配列内の少なくとも 1 つの要素が Short であり、かつその映画は 1910 より前にリリースされている映画を返します。
db.movies.find( { genres: "Short", year: { $lt: 1910 } }, { _id: 0, title: 1, year: 1, genres: 1 } )
[ { genres: [ 'Short', 'Western' ], title: 'The Great Train Robbery', year: 1903 }, { genres: [ 'Short', 'Drama' ], title: 'A Corner in Wheat', year: 1909 }, { genres: [ 'Short', 'Romance' ], title: 'The Kiss', year: 1896 }, { genres: [ 'Short', 'Romance' ], title: 'The Kiss', year: 1896 } ]
注意
moviesコレクション内のdocumentには、ここに表示されていない追加フィールドが含まれています。
詳細
埋め込みドキュメント フィールドにマルチキー インデックスを作成する方法については、「配列内の埋め込みフィールドにインデックスを作成する 」を参照してください。
マルチキー インデックスの限界の詳細については、「 マルチキー インデックスの限界 」を参照してください。