2012-06-05 26 views
7

Al realizar una consulta en MongoDb, necesito obtener un recuento total de todas las coincidencias, junto con los documentos en sí mismos como un subconjunto limitado/paginado.mongodb obtener recuento sin repetir find

Puedo lograr el objetivo con dos consultas, pero no veo cómo hacer esto con una sola consulta. Espero que haya una característica de mongo que, en cierto sentido, sea equivalente a SQL_CALC_FOUND_ROWS, ya que parece exagerado tener que ejecutar la consulta dos veces. Cualquier ayuda sería genial. ¡Gracias!

EDITAR: Aquí está el código de Java para hacer lo anterior.

 DBCursor cursor = collection.find(searchQuery).limit(10); 
    System.out.println("total objects = " + cursor.count()); 

Respuesta

3

no estoy seguro de que el lenguaje que está usando, pero normalmente se puede llamar a un método count en el cursor que es el resultado de una consulta find y luego usar ese mismo cursor para obtener los documentos mismos.

+0

gracias por su ayuda, funciona como un encanto. Estoy usando Java y el cursor tiene un método de conteo. – adamSpline

+7

Esto no es del todo correcto. La pregunta pregunta cómo hacerlo con una * consulta *. El uso de 'cursor.count()' solo delega la segunda consulta al controlador del cliente, pero la segunda consulta se sigue ejecutando. – Raman

2

No solo es excesivo ejecutar la consulta dos veces, sino que también existe el riesgo de incoherencia. La colección puede cambiar entre las dos consultas, o cada consulta puede enrutarse a un par diferente en un conjunto de réplicas, que puede tener diferentes versiones de la colección.

La función count() en los cursores (en el shell MongoDB JavaScript) realmente ejecuta otra consulta, puede ver que al escribir "cursor.count" (sin paréntesis), por lo que no es mejor que ejecutar dos consultas.

En el controlador C++, los cursores ni siquiera tienen una función de "conteo". Hay "itcount", pero solo gira sobre el cursor y obtiene todos los resultados, que no es lo que quiere (por razones de rendimiento). El controlador de Java también tiene "itcount", y allí la documentación dice que debe usarse solo para pruebas.

Parece que no hay forma de hacer un "buscar y obtener el conteo total" de manera consistente y eficiente.

Cuestiones relacionadas