MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Utilisation de $count dans une opération addField dans l'agrégation MongoDB

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.