Como dijo @Remon, count() tiene que escanear todos los documentos que coinciden con la consulta/filtro. Es O (n) donde n es el número de documentos que coincidirá con el índice, o el número de documentos en la colección si el campo no está indexado.
En tales casos, normalmente desea volver a visitar su requisito. ¿Realmente necesita un número preciso para el resultado 10161684? Si la precisión es importante, debe mantener un contador separado para la consulta en particular.
Pero en la mayoría de los casos, la precisión no es importante. Es uno de los dos:
- No te importa si se trata de 10 millones o 10,2 millones de dólares, pero el orden de magnitud es importante, es decir, se preocupa por si se trata de 8 millones o 10 millones.
- Solo le importa el número exacto si es pequeño. Es decir, le interesa saber que hay 44 resultados o 72. Pero una vez que va más allá, digamos, 1000, puede decir 'Más de 1000 objetos' encontrados para el usuario.
En mis aplicaciones, encontré que la segunda opción es lo que quiero. Por lo tanto, también limito la consulta count(), de modo que el conteo se detiene cuando alcanza un límite. De este modo:
db.datasources.find({nid: 19882}).limit(1000).count(true)
Para el usuario, exhibo '1000 o más resultados encontrados' si el recuento es de 1000, de lo contrario, puedo mostrar el número exacto.
En cuanto a la primera opción ... No he pensado en una solución ordenada todavía.
Aunque tenga un índice en nid, es posible que no sea residente en la memoria. ¿Qué sucede si ejecuta la consulta por segunda vez, es más rápido? –
No, aún es lento –
¿Cuánto tiempo tarda la primera consulta? ¿Estás seguro de que no hay otras operaciones ejecutándose en el servidor? –