Desde a v.3.4 (eu acho) o MongoDB agora tem um novo operador de pipeline de agregação chamado 'facet' que em suas próprias palavras:
Processa vários pipelines de agregação em um único estágio no mesmo conjunto de documentos de entrada. Cada subpipeline tem seu próprio campo no documento de saída onde seus resultados são armazenados como uma matriz de documentos.
Neste caso em particular, isso significa que se pode fazer algo assim:
$result = $collection->aggregate([
{ ...execute queries, group, sort... },
{ ...execute queries, group, sort... },
{ ...execute queries, group, sort... },
{
$facet: {
paginatedResults: [{ $skip: skipPage }, { $limit: perPage }],
totalCount: [
{
$count: 'count'
}
]
}
}
]);
O resultado será (com para ex 100 resultados totais):
[
{
"paginatedResults":[{...},{...},{...}, ...],
"totalCount":[{"count":100}]
}
]