Mongodb 聚合查询以根据数组中对象内的字段对所有值求和
Mongodb Aggregate query to sum all values based on fields inside objects in an Array
我在 MongoDB 中有一个集合 data
,看起来像这样 -
文档 1-
{
metadata:[
{
"title": "High",
"val": 12
},
{
"title": "Medium",
"val": 15
},
{
"title": "Low",
"val": 2
}
]
}
文档 2 -
{
metadata:[
{
"title": "High",
"val": 10
},
{
"title": "Medium",
"val": 12
},
{
"title": "Low",
"val": 20
}
]
}
&等等..
我希望根据 title
值聚合 val
字段。
输出应该类似于 -
{
"High": 22,
"Medium": 27,
"Low": 22
}
我该如何实现?提前致谢。
您可以先 $unwind metadata
数组。然后使用 $group 和 $cond 对您的值进行 $sum。
这里是mongo playground供您参考。
$unwind
解构metadata
数组
$grpup
乘以title
并求和val
$group
null,$arrayToObject
将数组从键和值转换为对象,并使用 $mergeObjects
合并对象
db.collection.aggregate([
{ $unwind: "$metadata" },
{
$group: {
_id: "$metadata.title",
sum: { $sum: "$metadata.val" }
}
},
{
$group: {
_id: null,
metadata: {
$mergeObjects: {
$arrayToObject: [
[{ k: "$_id", v: "$sum" }]
]
}
}
}
}
])
我在 MongoDB 中有一个集合 data
,看起来像这样 -
文档 1-
{
metadata:[
{
"title": "High",
"val": 12
},
{
"title": "Medium",
"val": 15
},
{
"title": "Low",
"val": 2
}
]
}
文档 2 -
{
metadata:[
{
"title": "High",
"val": 10
},
{
"title": "Medium",
"val": 12
},
{
"title": "Low",
"val": 20
}
]
}
&等等..
我希望根据 title
值聚合 val
字段。
输出应该类似于 -
{
"High": 22,
"Medium": 27,
"Low": 22
}
我该如何实现?提前致谢。
您可以先 $unwind metadata
数组。然后使用 $group 和 $cond 对您的值进行 $sum。
这里是mongo playground供您参考。
$unwind
解构metadata
数组$grpup
乘以title
并求和val
$group
null,$arrayToObject
将数组从键和值转换为对象,并使用$mergeObjects
合并对象
db.collection.aggregate([
{ $unwind: "$metadata" },
{
$group: {
_id: "$metadata.title",
sum: { $sum: "$metadata.val" }
}
},
{
$group: {
_id: null,
metadata: {
$mergeObjects: {
$arrayToObject: [
[{ k: "$_id", v: "$sum" }]
]
}
}
}
}
])