有没有办法与explain
一起运行runCommand
?我有以下查询:
db.runCommand({geoNear:"Locations", near:[50,50], spherical:true})
如何在其上运行explain
?我想获得执行时间。
答案 0 :(得分:1)
据我所知,explain
是一种游标方法。但是,您可以启用integrated mongodb profiler:
db.setProfilingLevel(2); // log all operations
db.setProfilingLevel(1, 50); // log all operations longer than 50msecs
这会将nscanned
,nreturned
等详细信息记录到名为system.profile
的上限集合中,但不会提供与explain()
调用相同的详细信息。
在这种情况下,我认为有可能将runCommand
更改为$near
- 查询吗?这样您就可以完全访问explain
。
答案 1 :(得分:1)
我想我们无法解释runCommand。一些runCommand会自动为您提供统计信息(例如,不同的命令:db.runCommand({distinct:'test',key:'a'}))
但是,您可以获取查询分析器的帮助。
db.setProfilingLevel(2)
运行该查询后,请关闭探查器,并检查system.profile集合以查询此查询。
答案 2 :(得分:1)
根据explain docs,您可以简单地:
db.runCommand({
explain: {geoNear:"Locations", near:[50,50], spherical:true}
})
答案 3 :(得分:0)
这两个答案(来自mnemosyn
和Abhishek Kumar
)都是正确的。
但是,如果你只是想看看执行时间(就像我一样),结果中会提供一些额外的统计数据:
...
"stats" : {
"time" : 2689,
"btreelocs" : 0,
"nscanned" : 1855690,
"objectsLoaded" : 979,
"avgDistance" : 0.006218027001875209,
"maxDistance" : 0.006218342348749806
},
"ok" : 1
嗯,我应该在发布问题之前仔细观察:)。
答案 4 :(得分:-1)
也许不是runCommand
,但我使用的是这样的:
expStats = function() {
var exp = db.collection.find({"stats.0.age" : 10},{"stats.age" : 1}).explain("allPlansExecution");
print ("totalDocsExamined = "+exp.executionStats.totalDocsExamined);
print ("nReturned = "+exp.executionStats.nReturned);
return print ("execTime = "+exp.executionStats.executionTimeMillis);
}