在MongoDB中,您可以获得有关如何执行查询的说明,并提供有趣的性能信息:
> db.people.find({ 'items' : { '$gte' : 1 } }).explain()
我是否可以获得相同的“计数”(这不是查询,而是命令)?
> db.people.count({ 'items' : { '$gte' : 1 } })
答案 0 :(得分:14)
Mongo 3.0引入了一种解释非游标请求的新方法:
db.my_collection.explain().count()
请参阅:http://docs.mongodb.org/manual/reference/method/db.collection.explain/#db.collection.explain
答案 1 :(得分:7)
基于https://jira.mongodb.org/browse/SERVER-14098,新的未来版本将支持以下格式:
db.runCommand({
explain: {
count: 'collectionName',
query: {
foo: 'bar'
}
}
})
答案 2 :(得分:3)
我很确定count(查询)是find(查询).count()的缩写 - 换句话说,解释完全相同。除了完整的收集计数外,没有特定的计数优化。例如,对一个范围的非索引字段运行计数所花费的时间与运行具有相同范围的find.explain完全相同。
我写了一个名为timeCount的函数,它取计数函数时间的平均值,然后显示解释输出以供比较。
function timeCount(coll, query) {
var n = 5;
var total = 0;
for(var i = 0; i < n; i++) {
var start = new Date();
db[coll].find(query).count();
var end = new Date();
total += (end - start);
print("time[" + i + "]: " + (end - start) + "ms");
}
print("average time: " + (total / n));
var explain = db[coll].find(query).explain();
print("explain (from find): ");
for(e in explain) {
if(typeof explain[e] == "string" || typeof explain[e] == "number") {
print(e + ": " + explain[e]);
}
}
}
输出如下:
> timeCount('test',{x:{$gt:5000}});
time[0]: 1339ms
time[1]: 1280ms
time[2]: 1347ms
time[3]: 1322ms
time[4]: 1299ms
average time: 1317.4
explain (from find):
cursor: BtreeCursor x_1_y_1
nscanned: 995062
nscannedObjects: 995062
n: 995062
millis: 1390
nYields: 0
nChunkSkips: 0
答案 3 :(得分:0)
目前你不能在explain()
上count()
因为它是一个命令而不是光标。
这是跟踪此请求的JIRA问题:https://jira.mongodb.org/browse/SERVER-3493