我有以下查询
db.getCollection("order_error").find({
"$and":[
{
"type":"orderResult"
},
{
"Origin.SN":{
"$in":[
"5701097",
"5701099"
]
}
},
{
"productLowerCase":{
"$regex":"capp",
"$options":"i"
}
}
]
}).sort({"timestamp.milliseconds" : -1}).skip(1).limit(100).explain("executionStats")
这个查询使用的索引是
type_1_Origin.SN_1_timestamp.milliseconds_-1
阶段是
IXSCAN(对于 Origin.SN = 5701099)-> IXSCAN(对于 Origin.SN = 5701097)-> SORT_MERGE -> FETCH -> SKIP -> LIMIT
我可以看到排序也发生在索引上,因此该部分得到了优化。但问题在于 FETCH 阶段。那里的过滤器如下
{
"productLowerCase":{
"$regex":"capp",
"$options":"i"
}
}
这部分没有优化。即使我创建了一个像 productLowerCase_1 这样的索引并将查询更改为使用左锚定正则表达式,该索引甚至也没有在 FETCH 阶段使用。MongoDB 在查询中是否只使用一个索引?有什么办法可以让它在查询中使用 productLowerCase_1 索引和 type_1_Origin.SN_1_timestamp.milliseconds_-1 索引?