Как получить объяснение для счета MongoDB?

В MongoDB вы можете получить объяснение того, как был выполнен запрос, с интересной информацией о производительности:

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

Могу ли я получить то же самое для "count" (который не является запросом, а командой)?

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

Ответ 2

На основе https://jira.mongodb.org/browse/SERVER-14098 новая версия будет поддерживать это в формате:

db.runCommand({
    explain: {
        count: 'collectionName',
        query: {
            foo: 'bar'
        }
    }
})

Ответ 3

Я уверен, что count (query) является short для 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

Ответ 4

В настоящий момент вы не можете explain() на count(), потому что считаете его командой, а не курсором.

Это проблема JIRA, отслеживающая этот запрос: https://jira.mongodb.org/browse/SERVER-3493