mongodb - `.explain()` on a query from profiler -


tl;dr: there maybe native way run .explain() on query profiler either passing whole profiler result or query part?

query

db.test.find({ "name": "ale" }) 

after running query can retrieve system.profile looks this:

{     "op" : "query",     "ns" : "test.test",     "query" : {         "find" : "test",         "filter" : {             "name" : "ale"         }     },     "keysexamined" : 0,     "docsexamined" : 27,     "cursorexhausted" : true,     "numyield" : 0,     "locks" : {         "global" : {             "acquirecount" : {                 "r" : numberlong(2)             }         },         "database" : {             "acquirecount" : {                 "r" : numberlong(1)             }         },         "collection" : {             "acquirecount" : {                 "r" : numberlong(1)             }         }     },     "nreturned" : 1,     "responselength" : 149,     "protocol" : "op_command",     "millis" : 12,     "plansummary" : "collscan",     "execstats" : {         "stage" : "collscan",         "filter" : {             "name" : {                 "$eq" : "ale"             }         },         "nreturned" : 1,         "executiontimemillisestimate" : 0,         "works" : 29,         "advanced" : 1,         "needtime" : 27,         "needyield" : 0,         "savestate" : 0,         "restorestate" : 0,         "iseof" : 1,         "invalidates" : 0,         "direction" : "forward",         "docsexamined" : 27     },     "ts" : isodate("2017-03-28t12:00:29.582z"),     "client" : "127.0.0.1",     "appname" : "mongodb shell",     "allusers" : [ ],     "user" : "" } 

now, run .explain() on query profiler. don't have access original query, profiler , query in profiler looks (after extracting profiler output above):

"op" : "query", "ns" : "test.test", "query" : {     "find" : "test",     "filter" : {         "name" : "ale"     } } 

to able run .explain() on query need convert form:

db.test.find({ "name": "ale" }) 

and append .explain() it:

db.test.find({ "name": "ale" }).explain() 

this bit problematic can have different query types - not find() aggregate(), count(), distinct(), group(), remove() , update().

is there maybe native way run .explain() on query profiler either passing whole profiler result or query part?

the query value in db.runcommand() format, can repeat as:

db.runcommand({     "find" : "test",     "filter" : {         "name" : "ale"     } }) 

or

var query = db.system.profile.findone({...}).query; db.runcommand(query); 

to explain query, can use in explain command:

db.runcommand({     explain: {         "find" : "test",         "filter" : {             "name" : "ale"         }     } }) 

or

var query = db.system.profile.findone({...}).query; db.runcommand({explain: query}); 

edit:

an example update command requires bit of re-shaping:

var update = (({ ns, query, updateobj }) => ({      update: ns.split(/\./).slice(1).join('.'), // collection name     updates:[{q:query, u:updateobj}] // filter , update }))(db.system.profile.findone({"op" : "update", ... })); db.runcommand({explain: update}); 

Comments

Popular posts from this blog

inversion of control - Autofac named registration constructor injection -

verilog - Systemverilog dynamic casting issues -

ios - Change Storyboard View using Seague -