Depuis la v.3.4 (je pense), MongoDB a maintenant un nouvel opérateur de pipeline d'agrégation nommé "facette" qui, selon ses propres mots :
Traite plusieurs pipelines d'agrégation en une seule étape sur le même ensemble de documents d'entrée. Chaque sous-pipeline a son propre champ dans le document de sortie où ses résultats sont stockés sous forme de tableau de documents.
Dans ce cas particulier, cela signifie que l'on peut faire quelque chose comme ceci :
$result = $collection->aggregate([
{ ...execute queries, group, sort... },
{ ...execute queries, group, sort... },
{ ...execute queries, group, sort... },
{
$facet: {
paginatedResults: [{ $skip: skipPage }, { $limit: perPage }],
totalCount: [
{
$count: 'count'
}
]
}
}
]);
Le résultat sera (avec par exemple 100 résultats totaux):
[
{
"paginatedResults":[{...},{...},{...}, ...],
"totalCount":[{"count":100}]
}
]