Je suis presque sûr que count(query) est l'abréviation de find(query).count()-en d'autres termes, l'explication est exactement la même. Il n'y a pas d'explication spécifique optimisation du comptage fait, sauf peut-être pour un comptage complet des collections. Par exemple, l'exécution d'un comptage sur un champ non indexé pour une plage prend exactement le même temps que l'exécution d'un find.explain avec la même plage.
J'ai écrit une fonction appelée timeCount qui prend la moyenne du temps de la fonction de comptage, puis affiche la sortie de l'explication pour comparaison.
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]);
}
}
}
Le résultat ressemble à ceci :
> 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