我试图找到聚合运算符的正确组合,以将名为“ totalCount”的字段添加到我的mongoDB视图中。
这将使我获得聚合管道此特定阶段的计数,并根据每个文档的计数结果将其输出:
{
$count: "count"
}
但是我最终得到了一个具有此结果的文档,而不是我要尝试完成的结果,那就是将该值打印为addedField
,它是所有文档,或者更好的是,它的值将in addition
打印到返回的文档中。
我已经尝试过了,但是它给我一个错误““无法识别的表达式'$ count'”,“:
{
$addFields: {
"totalCount" : { $count: "totalCount" }
}
}
正确的语法结构是什么?是否可以通过这种方式执行此操作,还是需要使用$sum
或其他一些运算符来完成此工作?我也尝试过:
{
$addFields: {
"totalCount" : { $sum: { _id: 1 } }
}
},
...但是虽然它没有给我任何错误,但它只会在每个文档上打印0
作为该字段的值,而不是所有文档的总数。
答案 0 :(得分:4)
总计数始终是一个文档的结果,因此您需要$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" } ]
}
}
}
])
在$facet
阶段之后,您将获得像这样的单个文档
{
"totalCount" : [
{
"value" : 3
}
],
"pipelineResults" : [
{
"_id" : ObjectId("5b313241120e4bc08ce87e46")
},
//....
]
}
然后,您必须使用$unwind将数组转换为多个文档,并使用$replaceRoot和$mergeObjects将常规管道结果提升为根级别。