English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB カバリングクエリ

この章では、インデックスカバークエリについて学びます。

インデックスカバークエリとは何ですか?

公式の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" }

最後に、インデックスがクエリをカバーできない場合、

  • すべてのインデックスフィールドは配列です

  • すべてのインデックスフィールドはサブドキュメントです