English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この章では、インデックスカバークエリについて学びます。
公式のMongoDBドキュメントによると、インデックスカバークエリは以下のようなクエリです。-
クエリのすべてのフィールドはインデックスの一部です。
クエリで返されるすべてのフィールドは同じインデックス内にあります。
クエリに含まれるすべてのフィールドがインデックスの一部であるため、MongoDBはクエリ条件をマッチし、同じインデックスを使用して結果を返します。実際にはドキュメント内部を確認することなく、インデックスからデータを取得することで、ドキュメントをスキャンするよりもはるかに高速です。
テストする必要のあるクエリについては、以下を参照してくださいsers
コレクション内の以下のドキュメント-
{ "_id": ObjectId("53402597d852426020000003"), "contact": "987654321", "dob": "0"1-01-1991", "gender": "M", "name": "Tom Benzamin", "user_name": "tombenzamin" }
私たちはまず以下のクエリを使用して、genderとuser_nameフィールド上でusersコレクションに複合索引を作成します–
>db.users.createIndex({gender:1,user_name:1}) { "createdCollectionAutomatically": false, "numIndexesBefore": : 1, "numIndexesAfter": : 2, "ok" : 1 }
今、このインデックスは以下のクエリをカバーします-
>db.users.find({gender:"M"},{user_name:1,_id:0}) { "user_name" : "tombenzamin" }
つまり、上記のクエリに対して、MongoDBはデータベースドキュメントを確認しません。代わりに、インデックスデータから必要なデータを取得します。これは非常に高速です。
インデックスには含まれていません_id
フィールド、そのため、MongoDBがデフォルトで各クエリで_idフィールドを返すため、それをクエリの結果セットから明示的に除外しました。したがって、以下のクエリには上で作成されたインデックスには含まれません-
>db.users.find({gender:"M"},{user_name:1}) { "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" }
最後に、インデックスがクエリをカバーできない場合、
すべてのインデックスフィールドは配列です
すべてのインデックスフィールドはサブドキュメントです