0

我有以下查询

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 索引?

4

0 回答 0