在MongoDB聚合中的“ addField”操作中使用“ $ count”

Mui*_*rik 5 count mongodb

我试图找到聚合运算符的正确组合,以将标题为“ totalCount”的字段添加到我的mongoDB视图中。

这将使我获得聚合管道此特定阶段的计数,并将其作为每个文档的计数结果输出:

    {
        $count: "count"
    }
Run Code Online (Sandbox Code Playgroud)

但是,我最终得到了一个具有此结果的文档,而不是我要尝试完成的结果,那就是使该值作为addedField在所有文档中的字段/值,甚至更好地是一个值打印出来打印in addition到返回的文档。

我已经尝试过了,但是它给了我一个错误““无法识别的表达式'$ count'”,“:

    {
        $addFields: {
          "totalCount" : { $count: "totalCount" }
        }
    }
Run Code Online (Sandbox Code Playgroud)

为此,正确的语法结构是什么?是否可以通过这种方式执行此操作,或者是否需要使用$sum或其他一些运算符来执行此操作?我也试过这个:

    {
        $addFields: {
          "totalCount" : { $sum: { _id: 1 } }
        }
    },
Run Code Online (Sandbox Code Playgroud)

...但是它并没有给我任何错误,它只是打印0为每个文档中该字段的值,而不是所有文档的总数。

mic*_*ckl 7

总计数始终是一个文档的结果,因此您需要$ facet来运行多个聚合管道,然后合并结果。假设您的常规管道包含,$project并且您希望将其结果与合并$count。您可以在聚合下面运行:

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" } ]
            }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

完成$facet阶段后,您将获得像这样的单个文档

{
    "totalCount" : [
        {
            "value" : 3
        }
    ],
    "pipelineResults" : [
        {
            "_id" : ObjectId("5b313241120e4bc08ce87e46")
        },
        //....
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后,您必须使用$ unwind将数组转换为多个文档,并使用$ replaceRoot$ mergeObjects将常规管道结果提升为根级别。