我正在 mongodb shell 中的分片集群上运行解释命令。stage
从输出中我看到第一个inputStage
是PROJECTION
. 不太明白这个阶段是什么意思。我在 mongodb 网站上找不到它。这个阶段有定义吗?
"winningPlan" : {
"stage" : "SUBPLAN",
"inputStage" : {
"stage" : "PROJECTION",
"transformBy" : {
"body" : 1,
"headers.Date" : 1
},
"inputStage" : {
"stage" : "SHARDING_FILTER",
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "OR",
"inputStages" : [
{
"stage" : "IXSCAN",
"keyPattern" : {
"filename" : 1
},
"indexName" : "filename_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"filename" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"filename" : [
"[\"1046\", \"1046\"]"
]
}
},
{
"stage" : "IXSCAN",
"keyPattern" : {
"headers.From" : 1
},
"indexName" : "headers.From_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"headers.From" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"headers.From" : [
"[\"[email protected]\", \"[email protected]\"]"
]
}
}
]
}
}
}
}
},
"rejectedPlans" : [ ]
}
我使用的查询命令是:
db.testmsg.find(
{
$or: [ { "filename": "1046"}, {"headers.From":"[email protected]"}]
},{
"body": 1, "headers.Date": 1
}).explain();
在您的查询中,您拥有
,{"body": 1, "headers.Date": 1}
所谓的“投影”,您可以在其中告诉查询,您想要获得哪些键 (+ _id)。如果你不需要_id
在你的结果中(你的项目_id:0
)并且所有其他键都可以从索引中找到,结果可以从索引中返回并且数据库引擎不需要去实际的集合来获取_id
(那是因为 _id 总是返回,除了它被投影出来;如果索引没有 _id 作为字段之一,则必须从磁盘读取值)