埋め込みドキュメントにインデックスを作成する
埋め込みドキュメント全体にインデックスを作成できます。 ただし、インデックスを使用するのは埋め込みドキュメント全体を指定するクエリのみです。 ドキュメント内の特定のフィールドに対するクエリでは、インデックスは使用されません。
このタスクについて
埋め込みドキュメントでインデックスを利用するには、クエリで埋め込みドキュメント全体を指定する必要があります。 これにより、スキーマ モデルが変更され、インデックス ドキュメントからフィールドを追加または削除すると、予期しない動作が発生する可能性があります。
埋め込みドキュメントをクエリする場合は、クエリ内のフィールドを指定する順序が重要です。 クエリ内の埋め込みドキュメントと返されるドキュメントは、完全に一致する必要があります。 埋め込みドキュメントに対するクエリの例については、「埋め込み / ネストされたドキュメントに対するクエリ 」を参照してください。
埋め込みドキュメントにインデックスを作成する前に、そのドキュメント内の特定のフィールドにインデックスを作成するか、ワイルドカード インデックスを使用してドキュメントのすべてのサブフィールドにインデックスを作成するかを検討してください。
始める前に
次のドキュメントを含む students
コレクションを作成します。
db.students.insertMany( [ { "name": "Alice", "gpa": 3.6, "location": { city: "Sacramento", state: "California" } }, { "name": "Bob", "gpa": 3.2, "location": { city: "Albany", state: "New York" } } ] )
手順
location
フィールドにインデックスを作成します。
db.students.createIndex( { location: 1 } )
結果
次のクエリでは、 location
フィールドのインデックスを使用します。
db.students.find( { location: { city: "Sacramento", state: "California" } } )
次のクエリでは、埋め込みドキュメント内の特定のフィールドをクエリするため、 location
フィールドのインデックスは使用されません。
db.students.find( { "location.city": "Sacramento" } ) db.students.find( { "location.state": "New York" } )
ドット表記クエリでインデックスを使用するには、埋め込みオブジェクト全体ではなく、クエリ対象の特定の埋め込みフィールドにインデックスを作成する必要があります。 例については、「埋め込みフィールドでのインデックスの作成 」を参照してください。
次のクエリでは、クエリ述語内の埋め込みフィールドがドキュメント内に表示されるとは異なる順序で指定されているため、結果は返されません。
db.students.find( { location: { state: "California", city: "Sacramento" } } )