16

在 MongoDB 中,您可以获得有关如何执行查询的解释,以及有趣的性能信息:

> db.people.find({ 'items' : { '$gte' : 1 } }).explain()

我可以为“计数”(不是查询,而是命令)获得相同的结果吗?

> db.people.count({ 'items' : { '$gte' : 1 } })
4

3 回答 3

22

Mongo 3.0 引入了一种解释非游标请求的新方法:

db.my_collection.explain().count()

请参阅:http ://docs.mongodb.org/manual/reference/method/db.collection.explain/#db.collection.explain

于 2015-04-16T14:09:18.883 回答
10

基于https://jira.mongodb.org/browse/SERVER-14098,新的未来版本将支持此格式:

db.runCommand({
    explain: {
        count: 'collectionName',
        query: {
            foo: 'bar'
        }
    }
})
于 2015-02-20T22:43:20.777 回答
3

我很确定 count(query) 是 find(query).count() 的缩写——换句话说,解释是完全一样的。没有进行特定的计数优化,除了可能是完整的收集计数。例如,对范围的非索引字段运行计数与运行具有相同范围的 find.explain 所花费的时间完全相同。

我编写了一个名为 timeCount 的函数,它取 count 函数时间的平均值,然后显示解释输出以进行比较。

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
于 2012-04-13T04:35:47.327 回答