我有以下格式的数据:
[{
"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相加。通过这种方式,您将永远不必担心fieldHeader中的字段名称或状态。
这是查询:
db.collection.aggregate([
{
$project: {
revenueHeader: {
$objectToArray: "$revenueHeader"
}
}
},
{
$unwind: "$revenueHeader"
},
{
$group: {
_id: "$revenueHeader.k",
total: {
$sum: "$revenueHeader.v"
}
}
}
])
您可以here对其进行测试