Eu usei agregação para buscar 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),
));
Se eu executar esta consulta sem limite, 10 registros serão obtidos. Mas quero manter o limite de 2. Portanto, gostaria de obter a contagem total de registros. Como posso fazer com agregação? Por favor, me aconselhe. obrigado
Respostas:
Esta é uma das perguntas mais frequentes para obter o resultado paginado e o número total de resultados simultaneamente em uma única consulta. Não posso explicar como me senti quando finalmente consegui LOL.
O resultado será mais ou menos assim:
fonte
{ $group: { _id: null, count: { $sum:1 }, result: { $push: '$$ROOT' }}}
(inserir depois{$group:{}}
para contagem total achado.Desde a v.3.4 (eu acho) MongoDB tem agora um novo operador de pipeline de agregação chamado ' facet ' que em suas próprias palavras:
Neste caso específico, isso significa que se pode fazer algo assim:
O resultado será (com por ex 100 resultados totais):
fonte
$project
?Use para encontrar a contagem total na coleção resultante.
fonte
Você pode usar a função toArray e obter seu comprimento para a contagem total de registros.
fonte
TypeError: Parent.aggregate(...).toArray is not a function
este é o erro que dei com esta solução.Use o estágio de pipeline de agregação $ count para obter a contagem total de documentos:
Inquerir :
Resultado:
fonte
Eu fiz assim:
O agregado retornará a matriz, então apenas faça um loop e obtenha o índice final.
E outra maneira de fazer isso é:
fonte
var
declaração nem damap
chamada. As primeiras 3 linhas do seu primeiro exemplo são suficientes.A solução fornecida por @Divergent funciona, mas na minha experiência é melhor ter 2 consultas:
A solução com o envio de $$ ROOT e o uso de $ slice atinge a limitação de memória do documento de 16 MB para grandes coleções. Além disso, para grandes coleções, duas consultas juntas parecem executar mais rápido do que aquela com envio de $$ ROOT. Você também pode executá-los em paralelo, portanto, você está limitado apenas pela mais lenta das duas consultas (provavelmente aquela que classifica).
Resolvi esta solução usando 2 consultas e estrutura de agregação (nota - eu uso node.js neste exemplo, mas a ideia é a mesma):
fonte
fonte
Isso pode funcionar para várias condições de correspondência
fonte
Eu precisava da contagem total absoluta após aplicar a agregação. Isso funcionou para mim:
Resultado:
fonte
Aqui estão algumas maneiras de obter a contagem total de registros ao fazer a agregação do MongoDB:
Usando
$count
:Para obter 1000 registros, leva em média 2 ms e é o caminho mais rápido.
Usando
.toArray()
:Para obter 1000 registros, leva em média 18 ms.
Usando
.itcount()
:Para obter 1000 registros, leva em média 14 ms.
fonte
Desculpe, mas acho que você precisa de duas perguntas. Um para visualizações totais e outro para registros agrupados.
Você pode achar útil esta resposta
fonte
Se você não quiser agrupar, use o seguinte método:
db.collection.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $count: 'count' } ] );
fonte