有一个集合people
,其中包含以下索引:
{"first_name": 1, "address.state": -1, "address.city": -1, "ssn": 1}
对于过滤和过滤排序下, 以下哪个查询将使用索引?
{ "first_name": { $gt: "J" } }).sort({ "address.city": -1 }
{ "first_name": "Jessica" }).sort({ "address.state": 1, "address.city": 1 }
{ "first_name": "Jessica", "address.state": { $lt: "S"} }).sort({ "address.state": 1 }
{"address.city":"West Cindy"}).sort({ "address.city":-1}
{"address.state":"South Dakota","first_name": "Jessica"}).sort({ "address.city":-1}
我已经通过以下问题: Which of the following queries will use the index?
但它只解释了过滤的索引,我需要为过滤器使用索引以及排序功能。
此外,我如何确定索引是否用于过滤器和放大器。分类 或未使用?
答案 0 :(得分:2)
Mongo使用Left中的索引,即{"first_name": 1, "address.state": -1, "address.city": -1, "ssn": 1}
索引可以应用于下面的字段查询 -
还应该注意,顺序对复合指数很重要。
回答问题,我知道这是M201课程实验2.1的作业问题,所以我很清楚数据集。我会一个接一个地选择 -
{ "first_name": { $gt: "J" } }).sort({ "address.city": -1 }
它不能是选项,因为sort在地址城市上,所以索引不能不按顺序使用。 { "first_name": "Jessica" }).sort({ "address.state": 1, "address.city": 1 }
这可以是一个选项。为了确保它,我们需要运行以下查询 -
var ex = db.people.explain();
ex.find({“first_name”:“Jessica”})。sort({“address.state”:1,“address.city”:1})
上面的查询返回一个没有类似“stage”的响应:“SORT”,它告诉我们使用索引在DB中发生排序。如果我们有Stage SORT,那么它会告诉RAM中发生了排序,DB无法使用索引在数据库中进行排序。
{ "first_name": "Jessica", "address.state": { $lt: "S"} }).sort({ "address.state": 1 }
我和选项2一样。
ex.find({“first_name”:“Jessica”,“address.state”:{$ lt:“S”}})。sort({“address.state”:1}) 上面的输出没有任何SORT阶段,表明DB能够使用索引进行排序。
{"address.city":"West Cindy"}).sort({ "address.city":-1}
忽略此原因,因为索引不在左侧。
{"address.state":"South Dakota","first_name": "Jessica"}).sort({ "address.city":-1}
这与选项2相同。我执行了类似的查询,没有得到任何SORT阶段,所以它使用索引进行排序。
使用索引进行过滤非常容易识别。如果ex.find(<Your query>)
正在提供“stage”:“COLLSCAN”,那么index不会用于过滤。选项2,3,5在ex.find()响应中没有“stage”:“COLLSCAN”,所以它们使用索引进行过滤。
这样我确保所有选项都使用索引进行过滤和排序。
您还可以为选项1和4运行ex.find(),然后您将获得“stage”:“COLLSCAN”或“stage”:“SORT”,表示索引未分别用于过滤或排序。 / p>
谢谢...