MongoDB-対象クエリ
この章では、対象となるクエリについて学習します。
対象クエリとは何ですか?
公式のMongoDBドキュメントによると、対象となるクエリは次のようなクエリです。
- クエリのすべてのフィールドはインデックスの一部です。
- クエリで返されるすべてのフィールドは同じインデックスにあります。
クエリに存在するすべてのフィールドはインデックスの一部であるため、MongoDBはクエリ条件に一致し、実際にドキュメントの内部を調べることなく、同じインデックスを使用して結果を返します。インデックスはRAMに存在するため、ドキュメントをスキャンしてデータをフェッチする場合に比べて、インデックスからデータをフェッチする方がはるかに高速です。
対象クエリの使用
対象となるクエリをテストするには、次のドキュメントを検討してください。 users コレクション−
{
"_id": ObjectId("53402597d852426020000003"),
"contact": "987654321",
"dob": "01-01-1991",
"gender": "M",
"name": "Tom Benzamin",
"user_name": "tombenzamin"
}
まず、の複合インデックスを作成します users フィールド上のコレクション gender そして user_name 次のクエリを使用する-
>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はデータベースドキュメントを調べません。代わりに、非常に高速なインデックス付きデータから必要なデータをフェッチします。
私たちのインデックスには含まれていないので _idMongoDBはデフォルトですべてのクエリで_idフィールドを返すため、フィールドはクエリの結果セットから明示的に除外しました。したがって、次のクエリは、上記で作成されたインデックス内ではカバーされていません。
>db.users.find({gender:"M"},{user_name:1})
{ "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" }
最後に、次の場合、インデックスはクエリをカバーできないことに注意してください。
- インデックス付きフィールドのいずれかが配列です
- インデックス付きフィールドのいずれかがサブドキュメントです