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
Post a Comment