Estoy bastante seguro de que count (query) es la abreviatura de find (query) .count() - en otras palabras, la explicación es exactamente la misma. No hay una optimización de recuento específica realizada, excepto tal vez para un recuento de recopilación completo. Por ejemplo, ejecutar un recuento en un campo no indexado para un rango lleva exactamente la misma cantidad de tiempo que ejecutar un find.explain con el mismo rango.
Escribí una función llamada timeCount que toma el promedio del tiempo de la función de conteo, y luego muestra la salida de explicación para la comparación.
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]);
}
}
}
La salida tiene el siguiente aspecto:
> 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
"Estoy bastante seguro de que count (query) es la abreviatura de find (query) .count() - en otras palabras, la explicación es exactamente la misma". Sí, pero no se puede obtener fácilmente una explicación de: 'db.people.find ({}). Count(). Explain()' es un error, al igual que 'db.people.count ({}). Explain () '. – Thilo
Solo decía que la explicación de find() te dará los mismos resultados que una explicación hipotética del recuento. –
No, eso no tiene sentido. Un hallazgo tiene que recuperar documentos, un recuento no. Con un índice, debería marcar una gran diferencia. – Thilo