Le nombre total sera toujours un résultat d'un seul document, vous avez donc besoin de $facette
pour exécuter plusieurs pipelines d'agrégation, puis fusionner les résultats. Supposons que votre pipeline régulier contienne un simple $project
et vous voulez fusionner ses résultats avec $count
. Vous pouvez exécuter l'agrégation ci-dessous :
db.col.aggregate([
{
$facet: {
totalCount: [
{ $count: "value" }
],
pipelineResults: [
{
$project: { _id: 1 } // your regular aggregation pipeline here
}
]
}
},
{
$unwind: "$pipelineResults"
},
{
$unwind: "$totalCount"
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [ "$pipelineResults", { totalCount: "$totalCount.value" } ]
}
}
}
])
Après $facet
vous obtiendrez un document unique comme celui-ci
{
"totalCount" : [
{
"value" : 3
}
],
"pipelineResults" : [
{
"_id" : ObjectId("5b313241120e4bc08ce87e46")
},
//....
]
}
Ensuite, vous devez utiliser $unwind pour transformer des tableaux en plusieurs documents et $replaceRoot avec $mergeObjects pour promouvoir les résultats réguliers du pipeline au niveau racine.