Explain

Explain é usado para visualizar os processos que foram execultados para localizar aquele documento. Dados como tempo de respostas, filtros utilizados, número de documentos processados são algumas informações que estão contidos dentro da função explain().

Primeiramente vamos pegar um documento aleatório usando a função _rand().

> db.restaurantes.find().limit( 1 ).skip( _rand() * db.restaurantes.count() )
{ "_id" : ObjectId("5655154139de2c323835d74c"), "address" : { "building" : "100", "coord" : [ -74.0078192, 40.7146326 ], "street" : "Chambers Street", "zipcode" : "10007" }, "borough" : "Manhattan", "cuisine" : "Donuts", "grades" : [ { "date" : ISODate("2014-06-06T00:00:00Z"), "grade" : "A", "score" : 7 },
{ "date" : ISODate("2013-06-10T00:00:00Z"), "grade" : "A", "score" : 13 }, { "date" : ISODate("2013-02-01T00:00:00Z"), "grade" : "A", "score" : 11 }, { "d
ate" : ISODate("2011-12-30T00:00:00Z"), "grade" : "A", "score" : 11 } ], "name" : "Dunkin' Donuts, Baskin Robbins", "restaurant_id" : "41084772" }

Para lembrar esses dados viram aleatóriamente, no meu caso veio o restaurante {“name” : “Dunkin’ Donuts, Baskin Robbins”}. Vamos então executar um find usado ele como parametrização de busca e utilizaremos a função _explain().

> var query = {"name" : "Dunkin' Donuts, Baskin Robbins"};
> db.restaurantes.find(query).explain()
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "be-mean.restaurantes",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "name" : {
                                "$eq" : "Dunkin' Donuts, Baskin Robbins"
                        }
                },
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "name" : {
                                        "$eq" : "Dunkin' Donuts, Baskin Robbins"
                                }
                        },
                        "direction" : "forward"
                },
                "rejectedPlans" : [ ]
        },
        "serverInfo" : {
                "host" : "gabriel",
                "port" : 27017,
                "version" : "3.0.7",
                "gitVersion" : "6ce7cbe8c6b899552dadd907604559806aa2e9bd"
        },
        "ok" : 1
}
>

Para trazermos mais detalhes podemos utilizar a expressão ‘executionStats’ dentro de explain

> db.restaurantes.find(query).explain('executionStats')
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "be-mean.restaurantes",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "name" : {
                                "$eq" : "Dunkin' Donuts, Baskin Robbins"
                        }
                },
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "name" : {
                                        "$eq" : "Dunkin' Donuts, Baskin Robbins"
                                }
                        },
                        "direction" : "forward"
                },
                "rejectedPlans" : [ ]
        },
        "executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 55,
                "executionTimeMillis" : 166,
                "totalKeysExamined" : 0,
                "totalDocsExamined" : 25359,
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "name" : {
                                        "$eq" : "Dunkin' Donuts, Baskin Robbins"
                                }
                        },
                        "nReturned" : 55,
                        "executionTimeMillisEstimate" : 110,
                        "works" : 25486,
                        "advanced" : 55,
                        "needTime" : 25305,
                        "needFetch" : 125,
                        "saveState" : 264,
                        "restoreState" : 264,
                        "isEOF" : 1,
                        "invalidates" : 0,
                        "direction" : "forward",
                        "docsExamined" : 25359
                }
        },
        "serverInfo" : {
                "host" : "gabriel",
                "port" : 27017,
                "version" : "3.0.7",
                "gitVersion" : "6ce7cbe8c6b899552dadd907604559806aa2e9bd"
        },
        "ok" : 1
}
>

Aqui temos dados interessantes por exemplo, podemos pegar as informações do servidor que utilizamos

"serverInfo" : {
	"host" : "gabriel",
	"port" : 27017,
	"version" : "3.0.7",
	"gitVersion" : "6ce7cbe8c6b899552dadd907604559806aa2e9bd"
}

Temos também o numero de documentos examinados:

"totalDocsExamined" : 25359,

O tempo que demoramos para a execução, lembrando que 1s tem 1000 miles segundos.

"executionTimeMillis" : 166

Conseguimos acessar diretamente cada informação

> db.restaurantes.find(query).explain('executionStats').executionStats.executionTimeMillis
15

Ou então, quais os filtros utilizados durante a busca

"filter" : {
        "name" : {
                "$eq" : "Dunkin' Donuts, Baskin Robbins"
        }
}

Compartilhe

Back