Estou executando um comando de explicação em um cluster de fragmentos no shell do mongodb. stage
Na saída , vejo que o primeiro inputStage
é PROJECTION
. Eu não entendo muito bem o que essa fase significa. E não consegui encontrá-lo no site mongodb. Existe uma definição para esta fase?
"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" : [ ]
}
O comando de consulta que usei é:
db.testmsg.find(
{
$or: [ { "filename": "1046"}, {"headers.From":"[email protected]"}]
},{
"body": 1, "headers.Date": 1
}).explain();
Na sua consulta você tem
,{"body": 1, "headers.Date": 1}
o que é chamado de "projeção" onde você informa para a consulta, quais chaves você deseja obter (+ _id). Se você não precisa_id
no seu resultado (você projeta_id:0
) e todas as outras chaves podem ser encontradas no índice, o resultado pode ser retornado do índice e o mecanismo de banco de dados não precisa ir para a coleção real para obter_id
(isso porque _id é sempre retornado, exceto que é projetado; se o índice não tiver _id como um dos campos, o valor deve ser lido do disco)