【发布时间】:2023-02-17 00:20:00
【问题描述】:
我试图在一个日期范围内找到一个值的最大值。我使用的聚合查询与索引列 _id 匹配。但是查询花费的时间太长,解释计划告诉我它正在进行 COLLSCAN 而不是索引扫描。你能建议为什么它不使用 _id 上的索引吗?
如果我在 colId 上创建另一个索引会有帮助吗?
{$match:{_id:{ $regex: 'regex'}}},
{$match:{$and:[{"colId":'DATA'}]}},
{$unwind:"$data"},
{$match:{$and:[{"data.time":{$gte:ISODate("xyz"),$lte:ISODate("zyx")}}]}},
{$match:{$and: [{ "data.col": { $exists: true}}] }},
{$group:{_id:"$data.time",maxCol:{$max:"$data.col"}}} ,
{$sort:{"maxCol":-1,_id:-1}},
{$limit:1}
])
解释计划sn-p:
"winningPlan" : {
"stage" : "LIMIT_SKIP",
"inputStage" : {
"stage" : "SORT",
"sortPattern" : {
"_id" : -1,
"maxCol" : -1
},
"inputStage" : {
"stage" : "SUBSCAN",
"inputStage" : {
"stage" : "HASH_AGGREGATE",
"inputStage" : {
"stage" : "SUBSCAN",
"inputStage" : {
"stage" : "PROJECTION",
"inputStage" : {
"stage" : "COLLSCAN"
}
}
}
}
}
}
这是在 DocumentDB (mongo4)
【问题讨论】: