J'ai utilisé l'agrégation pour récupérer les enregistrements 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 j'exécute cette requête sans limite, 10 enregistrements seront récupérés. Mais je veux garder la limite à 2. Je voudrais donc obtenir le nombre total d'enregistrements. Comment puis-je faire avec l'agrégation? S'il vous plait conseillez-moi. Merci
Réponses:
C'est l'une des questions les plus fréquemment posées pour obtenir le résultat paginé et le nombre total de résultats simultanément dans une seule requête. Je ne peux pas expliquer ce que j'ai ressenti quand je l'ai finalement atteint LOL.
Le résultat ressemblera à ceci:
la source
{ $group: { _id: null, count: { $sum:1 }, result: { $push: '$$ROOT' }}}
(insérer après{$group:{}}
pour le décompte total trouvé.Depuis la v.3.4 (je pense), MongoDB a maintenant un nouvel opérateur de pipeline d'agrégation appelé `` facet '' qui, dans leurs propres mots:
Dans ce cas particulier, cela signifie que l'on peut faire quelque chose comme ceci:
Le résultat sera (avec pour ex 100 résultats au total):
la source
$project
?Utilisez ceci pour trouver le nombre total dans la collection résultante.
la source
Vous pouvez utiliser la fonction toArray, puis obtenir sa longueur pour le nombre total d'enregistrements.
la source
TypeError: Parent.aggregate(...).toArray is not a function
c'est l'erreur que j'ai donnée avec cette solution.Utilisez l' étape de pipeline d'agrégation $ count pour obtenir le nombre total de documents:
Requete :
Résultat:
la source
Je l'ai fait de cette façon:
L'agrégat renverra le tableau donc il suffit de le boucler et d'obtenir l'index final.
Et une autre façon de le faire est:
la source
var
ni de la déclaration ni de l'map
appel. Les 3 premières lignes de votre premier exemple sont suffisantes.La solution fournie par @Divergent fonctionne, mais d'après mon expérience, il est préférable d'avoir 2 requêtes:
La solution consistant à pousser $$ ROOT et à utiliser $ slice s'exécute dans une limitation de la mémoire de document de 16 Mo pour les grandes collections. En outre, pour les grandes collections, deux requêtes semblent s'exécuter plus rapidement que celle avec $$ ROOT poussant. Vous pouvez également les exécuter en parallèle, vous n'êtes donc limité que par la plus lente des deux requêtes (probablement celle qui trie).
J'ai réglé cette solution en utilisant 2 requêtes et un cadre d'agrégation (note - j'utilise node.js dans cet exemple, mais l'idée est la même):
la source
la source
Cela pourrait fonctionner pour plusieurs conditions de correspondance
la source
J'avais besoin du décompte total absolu après avoir appliqué l'agrégation. Cela a fonctionné pour moi:
Résultat:
la source
Voici quelques moyens d'obtenir le nombre total d'enregistrements tout en effectuant l'agrégation MongoDB:
Utilisation
$count
:Pour obtenir 1000 enregistrements, cela prend en moyenne 2 ms et c'est le moyen le plus rapide.
Utilisation
.toArray()
:Pour obtenir 1000 enregistrements, cela prend en moyenne 18 ms.
Utilisation
.itcount()
:Pour obtenir 1000 enregistrements, cela prend en moyenne 14 ms.
la source
Désolé, mais je pense que vous avez besoin de deux requêtes. Un pour les vues totales et un autre pour les enregistrements groupés.
Vous pouvez trouver utile cette réponse
la source
Si vous ne souhaitez pas grouper, utilisez la méthode suivante:
db.collection.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $count: 'count' } ] );
la source