MongoDB 涵盖查询
在本章中,我们将学习涵盖的查询。
什么是涵盖查询?
根据官方的MongoDB文档,涵盖的查询是这样的查询,其中-
查询中的所有字段都是索引的一部分。
查询中返回的所有字段都在同一索引中。
由于查询中存在的所有字段都是索引的一部分,因此MongoDB会匹配查询条件,并使用相同的索引返回结果,而无需实际查看文档内部。由于索引存在于RAM中,因此与通过扫描文档获取数据相比,从索引获取数据要快得多。
使用覆盖查询
要测试涵盖的查询,请看sers
集合中的以下文档-
{ "_id": ObjectId("53402597d852426020000003"), "contact": "987654321", "dob": "01-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" }
最后,请记住,如果,索引不能覆盖查询
任何索引字段都是数组
任何索引字段都是子文档