5

我对以下查询运行解释:

db.explain().find({ site_id:1, dimensions:[], create_date: { $gte: new Date(1452603948196) } )

结果在维度字段上包含一个“过滤器”对象,而它应该使用索引过滤该字段,这是什么意思?这不是一个多余的阶段吗?

{ "winningPlan" : {
        "stage" : "FETCH",
        "filter" : {
            "dimensions" : {
                "$eq" : [ ]
            }
        },
        "inputStage" : {
            "stage" : "IXSCAN",
            "keyPattern" : {
                "site_id" : 1,
                "dimensions" : 1,
                "create_date" : 1
            }, }

据我了解,这意味着 mongo 在扫描索引并将文档提取到内存后再次过滤维度字段,是否正确?

谢谢,

4

2 回答 2

1

您的结果将根据维度等于数组中给定值的条件进行过滤。

于 2016-01-18T12:35:10.283 回答
0

你是对的。从解释文档

解释结果将查询计划呈现为阶段树。每个阶段将其结果(即文档或索引键)传递给父节点。叶节点访问集合或索引。内部节点操作由子节点产生的文档或索引键。根节点是 MongoDB 从中派生结果集的最后阶段。

并且

explain.queryPlanner.winningPlan.stage 表示阶段名称的字符串。

每个阶段都包含特定于该阶段的信息。例如,IXSCAN 阶段将包括索引边界以及特定于索​​引扫描的其他数据。如果一个阶段有一个子阶段或多个子阶段,则该阶段将有一个 inputStage 或 inputStages。

explain.queryPlanner.winningPlan.inputStage 描述子阶段的文档,它向其父阶段提供文档或索引键。如果父阶段只有一个孩子,则该字段存在。

换句话说,IXSCAN 是 FETCH 的子阶段(因为它是输入阶段),并且 IXSCAN 的结果被发送到 FETCH。

来源:https ://docs.mongodb.com/manual/reference/explain-results/

于 2017-02-08T09:10:17.037 回答