在聚合输出中添加一个单独的文档,用于MongoDB中其他输出文档字段的总和



我目前有一个包含三个阶段的聚合查询,它生成以下输出文档(这只是许多文档中的两个(:

{
"title" : "hr",
"num_files" : 420,
"affected_files" : 0,
"to_encrypt" : 6,
"affected_file_percentage" : 0
}
{
"title" : "mktng",
"num_files" : 69,
"affected_files" : 2,
"to_encrypt" : 5,
"affected_file_percentage" : 0.02898550724
}

我想添加最后一个具有以下输出的文档:

{
"title" : "total",
"num_files" : [sum of all files],
"affected_files" : [sum of all affected files],
"to_encrypt" : [sum of all files to be encrypted],
"affected_file_percentage" : [total percentage]
}

我在聚合函数中找不到任何东西,因为在管道中添加另一个阶段来汇总所有内容不允许我显示单个文档。我想在输出中同时显示的总和。这是怎么做到的?

您可以使用$facet在不同的字段中分离两者,

  • result: []将从根目录获取所有文档
  • total用一个total对象创建单独的数组,$group用sum numbers字段
db.collection.aggregate([
{
$facet: {
result: [],
total: [
{
$group: {
_id: null,
title: { $first: "total" },
num_files: { $sum: "$num_files" },
affected_files: { $sum: "$affected_files" },
to_encrypt: { $sum: "$to_encrypt" },
affected_file_percentage: { $sum: "$affected_file_percentage" }
}
}
]
}
}
])

游乐场


如果你只想在根目录中为total创建一个对象,那么试试

  • $facet$group与上述查询相同,之后添加以下阶段
  • $project使用$concatArrays连接两个阵列
  • $unwind解构根数组
  • $replaceWith替换根中的根对象
db.collection.aggregate([
{
$facet: {
result: [],
total: [
{
$group: {
_id: null,
title: { $first: "total" },
num_files: { $sum: "$num_files" },
affected_files: { $sum: "$affected_files" },
to_encrypt: { $sum: "$to_encrypt" },
affected_file_percentage: { $sum: "$affected_file_percentage" }
}
}
]
}
},
{
$project: {
root: { $concatArrays: ["$result", "$total"] }
}
},
{ $unwind: "$root" },
{ $replaceWith: "$root" }
])

游乐场

最新更新