He utilizado la agregación para obtener registros de mongodb.
$result = $collection->aggregate(array(
array('$match' => $document),
array('$group' => array('_id' => '$book_id', 'date' => array('$max' => '$book_viewed'), 'views' => array('$sum' => 1))),
array('$sort' => $sort),
array('$skip' => $skip),
array('$limit' => $limit),
));
Si ejecuto esta consulta sin límite, se recuperarán 10 registros. Pero quiero mantener el límite en 2. Así que me gustaría obtener el recuento total de registros. ¿Cómo puedo hacer con la agregación? Por favor, avíseme. Gracias
Respuestas:
Esta es una de las preguntas más frecuentes para obtener el resultado paginado y el número total de resultados simultáneamente en una sola consulta. No puedo explicar cómo me sentí cuando finalmente lo logré LOL.
El resultado se verá así:
fuente
{ $group: { _id: null, count: { $sum:1 }, result: { $push: '$$ROOT' }}}
(insertar después{$group:{}}
para el recuento total de la búsqueda.Desde la versión 3.4 (creo), MongoDB tiene ahora un nuevo operador de canalización de agregación llamado ' faceta ' que, en sus propias palabras:
En este caso particular, esto significa que uno puede hacer algo como esto:
El resultado será (con por ejemplo 100 resultados totales):
fuente
$project
?Use esto para encontrar el recuento total en la colección resultante.
fuente
Puede usar la función toArray y luego obtener su longitud para el recuento total de registros.
fuente
TypeError: Parent.aggregate(...).toArray is not a function
este es el error que di con esta solución.Utilice la etapa de canalización de agregación $ count para obtener el recuento total de documentos:
Consulta :
Resultado:
fuente
Lo hice de esta manera:
El agregado devolverá la matriz, así que simplemente repítala y obtén el índice final.
Y otra forma de hacerlo es:
fuente
var
declaración ni lamap
llamada. Las primeras 3 líneas de su primer ejemplo son suficientes.La solución proporcionada por @Divergent funciona, pero en mi experiencia es mejor tener 2 consultas:
La solución al presionar $$ ROOT y usar $ slice tiene una limitación de memoria de documentos de 16 MB para colecciones grandes. Además, para colecciones grandes, dos consultas juntas parecen ejecutarse más rápido que la que tiene $$ ROOT presionando. También puede ejecutarlos en paralelo, por lo que está limitado solo por la más lenta de las dos consultas (probablemente la que ordena).
Me he conformado con esta solución usando 2 consultas y un marco de agregación (nota: uso node.js en este ejemplo, pero la idea es la misma):
fuente
fuente
Esto podría funcionar para múltiples condiciones de partido
fuente
Necesitaba el recuento total absoluto después de aplicar la agregación. Esto funcionó para mí:
Resultado:
fuente
Aquí hay algunas formas de obtener el recuento total de registros mientras se realiza la agregación de MongoDB:
Usando
$count
:Para obtener 1000 registros, esto toma en promedio 2 ms y es la forma más rápida.
Usando
.toArray()
:Para obtener 1000 registros, esto lleva una media de 18 ms.
Usando
.itcount()
:Para obtener 1000 registros, esto lleva una media de 14 ms.
fuente
Lo siento, pero creo que necesitas dos consultas. Uno para vistas totales y otro para registros agrupados.
Puede encontrar útil esta respuesta
fuente
Si no desea agrupar, utilice el siguiente método:
db.collection.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $count: 'count' } ] );
fuente