[英]How to aggregate over map keys across all the documents in mongodB collection?
我有以下格式的数据:
[{
"OrderId": "406-5309498-5972326",
"revenueHeader": {
"Principal": 982.14,
"Product Tax": 117.86,
"Total": 1100
}},
{
"OrderId": "506-5234568-5934567",
"revenueHeader": {
"Principal": 382.54,
"Product Tax": 34.46,
"Shipping charge": 30.5,
"Giftwrap charge": 27.5,
"Total": 234
}}]
如何对所有文档中的键的 RevenueHeader 映射值求和? 注意:第一个文档中不存在“运费”,但我们仍然需要所有文档中此密钥的总和。 此外,密钥可能会有所不同,无法事先知道密钥的名称。
您必须使用$ objectToArray 来转换 {k,v} 对象数组中的 RevenueHeader。
然后,您可以 $unwind 数组,并按 RevenueHeader.k 进行分组,求和 RevenueHeader.v。 通过这种方式,您永远不会关心revenueHeader 中的字段名称或存在。
这是查询:
db.collection.aggregate([
{
$project: {
revenueHeader: {
$objectToArray: "$revenueHeader"
}
}
},
{
$unwind: "$revenueHeader"
},
{
$group: {
_id: "$revenueHeader.k",
total: {
$sum: "$revenueHeader.v"
}
}
}
])
你可以在这里测试
如果您不确定要获取跨文档值的总和的字段有多少,那么您可以使用@matthPen 提供的解决方案。
但是,如果您知道所有可能存在的字段,那么您可以直接使用带有键名的 $group 阶段。 如果文档数量非常大,我个人会避免使用 $unwind 。
[
{
$group: {
_id: null,
"Principal": { $sum: "$revenueHeader.Principal" },
"Product Tax": { $sum: "$revenueHeader.Product Tax" },
"Shipping charge": { $sum: "$revenueHeader.Shipping charge" },
"Giftwrap charge": { $sum: "$revenueHeader.Giftwrap charge" },
"Total": { $sum: "$revenueHeader.Total" },
}
}
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.