【问题标题】:MongoDB sort winingplan overrides hintMongoDB 排序 winingplan 覆盖提示
【发布时间】:2016-06-17 14:02:52
【问题描述】:

我创建了一个包含三个字段的集合,如下所述。之后,我在第二个字段上创建索引并使用排序和提示操作执行搜索。

为什么 - 即使使用先前创建的索引的提示 - MongoDB 将排序设置为winningPlan?

我相信如果我们用一些标准过滤数据并排序结果会更好,对吧?

收藏

> db.values.find()
{ "_id" : ObjectId("5763ffebe5a81f569b1005e5"), "field1" : "A", "field2" : "B", "field3" : "C" }

索引

> db.values.getIndexes()
  [
    {
      "v" : 1,
      "key" : {
          "_id" : 1
      },
      "name" : "_id_",
      "ns" : "peftest.values"
    },
    {
      "v" : 1,
      "key" : {
          "field2" : 1
      },
      "name" : "field2_1",
      "ns" : "peftest.values"
    }
  ]

查询和解释

> db.values.find({field2:"B"}).sort({field1:1}).hint({field2:1}).explain()
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "peftest.values",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "field2" : {
                "$eq" : "B"
            }
        },
        "winningPlan" : {
            "stage" : "SORT",
            "sortPattern" : {
                "field1" : 1
            },
            "inputStage" : {
                "stage" : "SORT_KEY_GENERATOR",
                "inputStage" : {
                    "stage" : "FETCH",
                    "inputStage" : {
                        "stage" : "IXSCAN",
                        "keyPattern" : {
                            "field2" : 1
                        },
                        "indexName" : "field2_1",
                        "isMultiKey" : false,
                        "isUnique" : false,
                        "isSparse" : false,
                        "isPartial" : false,
                        "indexVersion" : 1,
                        "direction" : "forward",
                        "indexBounds" : {
                            "field2" : [
                                "[\"B\", \"B\"]"
                            ]
                        }
                    }
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "apstrd14501d.intraservice.corp",
        "port" : 27017,
        "version" : "3.2.4",
        "gitVersion" : "e2ee9ffcf9f5a94fad76802e28cc978718bb7a30"
    },
    "ok" : 1
}

【问题讨论】:

  • inputStage 说它使用正确的索引获取数据 {"stage" : "IXSCAN", "keyPattern" : { "field2" : 1}, ...}.

标签: mongodb mongodb-query


【解决方案1】:

我认为该计划是您所期望的,但您从错误的角度看待它 :) 排序的输入阶段是索引扫描,因此查询计划首先使用索引,然后将结果数据传递给排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2015-07-05
    • 2012-02-23
    • 2012-06-12
    • 2012-09-05
    相关资源
    最近更新 更多