在我正在学习的mongodb课程中,我遇到了这个问题:我们必须找到要传递给下面查询的提示()的参数,才能获得所需的输出。
var exp = db.restaurants.explain("executionStats")
exp.find({ "address.state": "NY", stars: { $gt: 3, $lt: 4 } }).sort({ name: 1 }).hint(REDACTED)O/P:
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "m201.restaurants",
"indexFilterSet": false,
"parsedQuery": "REDACTED",
"winningPlan": {
"stage": "SORT",
"sortPattern": {
"name": 1
},
"inputStage": {
"stage": "SORT_KEY_GENERATOR",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": "REDACTED",
"indexName": "REDACTED",
"isMultiKey": false,
"isUnique": false,
"isSparse": false,
"isPartial": false,
"indexVersion": 1,
"direction": "forward",
"indexBounds": "REDACTED"
}
}
}
},
"rejectedPlans": [ ]
},
"executionStats": {
"executionSuccess": true,
"nReturned": 3335,
"executionTimeMillis": 20,
"totalKeysExamined": 3335,
"totalDocsExamined": 3335,
"executionStages": "REDACTED"
},
"serverInfo": "REDACTED",
"ok": 1
}答:{ "address.state":1,“星星”:1,“名称”:1}
给出了上面的答案,我不理解的是,如果address.state、星星和名称作为索引,并且由于查询包含按复合索引顺序排列的整前缀,所以内存排序阶段不应该发生。但是在这里,尽管在传递给函数的索引参数末尾有一个名称索引,但排序还是会发生的。为什么指定名称索引时会显式地进行排序?
发布于 2021-09-06 13:07:35
啊,找到答案了,如果查询谓词只包含相等条件,索引中的键可以用于过滤和排序。由于我们使用$gt和$lt,这里执行显式排序。
可能最佳性能的查询顺序:等式、排序、范围
https://stackoverflow.com/questions/69074918
复制相似问题