MongoDB Agrégation: Comment obtenir le nombre total d'enregistrements comte?
J'ai utilisé de l'agrégation pour l'extraction des 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 de 10 dossiers seront retournés. Mais je veux garder la limite de 2. Je voudrais donc, pour obtenir le nombre total d'enregistrements comte. Comment puis-je faire avec l'agrégation? Merci de me conseiller. Grâce
- Quels seraient les résultats si il n'y avait que 2?
Vous devez vous connecter pour publier un commentaire.
C'est l'une des questions les plus fréquemment posées pour obtenir le paginé résultat et le nombre total de résultats simultanément dans une seule requête. Je ne peux pas expliquer comment je me sentais quand j'ai finalement réalisé qu'il LOL.
Résultat devrait ressembler à quelque chose comme ceci:
{ $group: { _id: null, count: { $sum:1 }, result: { $push: '$$ROOT' }}}
(insérer, après{$group:{}}
pour compter tous les trouver.Depuis la v. 3.4 (je crois), MongoDB a maintenant une nouvelle agrégation opérateur de pipeline nommé " facette ' 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 par ex 100 nombre total de résultats):
$project
?L'utiliser pour trouver des nombre total de collection.
Vous pouvez utiliser toArray fonction et puis obtenir sa longueur pour le total des dossiers compte.
TypeError: Parent.aggregate(...).toArray is not a function
c'est l'erreur que j'ai donné à cette solution.Utiliser le $count agrégation étape du pipeline pour obtenir le total du nombre de documents:
Requête :
Résultat:
J'ai fait de cette façon:
Le total sera de retour le tableau de façon juste la boucle et obtenir la valeur finale de l'indice .
Et d'autres façon de le faire est:
var
déclaration, ni lamap
appel. Les 3 premières lignes de votre premier exemple est suffisant.Fournies par la Solution de @Divergentes fonctionne, mais dans mon expérience, il est préférable d'avoir 2 requêtes:
Solution poussant $$ROOT et de l'utilisation de $tranche s'exécute dans le document limitation de la mémoire de 16 MO pour de grandes collections. Aussi, pour les grandes collections de deux requêtes semblent courir plus vite que celui de $$RACINE de pousser. Vous pouvez les exécuter en parallèle, de sorte que vous ne sont limitées que par le plus lent des deux requêtes (probablement celui qui trie).
J'ai réglé avec cette solution à l'aide de 2 requêtes de l'agrégation et de cadre (note - je utiliser node.js dans cet exemple, mais l'idée est la même):
Cela pourrait être un travail pour plusieurs conditions de match
Désolé, mais je pense que vous avez besoin de deux requêtes. L'un pour le total des points de vue et un autre pour les enregistrements regroupés.
Vous pouvez trouver utile cette réponse