MongoDB 子文档的 $sum 和 $avg
MongoDB $sum and $avg of sub documents
我需要获取子文档的 $sum 和 $avg,我想获取 Channels[0].. 以及其他频道的 $sum 和 $avg。
我的数据结构是这样的
{
_id : ... Location : 1,
Channels : [
{ _id: ...,
Value: 25
},
{
_id: ... ,
Value: 39
},
{
_id: ..,
Value: 12
}
]
}
为了获得集合中每个文档的 sum 和 average,您需要使用 mongodb 的 Aggregation processing. Further, since Channels
is an array you will need to use the $unwind 运算符解构数组。
假设您的集合名为 example
,您可以通过以下方式获得 Channels.Value
的文档总和和平均值:
db.example.aggregate( [
{
"$unwind" : "$Channels"
},
{
"$group" : {
"_id" : "$_id",
"documentSum" : { "$sum" : "$Channels.Value" },
"documentAvg" : { "$avg" : "$Channels.Value" }
}
}
] )
您的 post 数据的输出将是:
{
"_id" : SomeObjectIdValue,
"documentSum" : 76,
"documentAvg" : 25.333333333333332
}
如果您的集合中有多个文档,那么您会看到每个文档的结果行都包含一个 Channels
数组。
解决方案 1:根据此示例使用两个组:
previous question
db.records.aggregate(
[
{ $unwind: "$Channels" },
{ $group: {
_id: {
"loc" : "$Location",
"cId" : "$Channels.Id"
},
"value" : {$sum : "$Channels.Value" },
"average" : {$avg : "$Channels.Value"},
"maximun" : {$max : "$Channels.Value"},
"minimum" : {$min : "$Channels.Value"}
}},
{ $group: {
_id : "$_id.loc",
"ChannelsSumary" : { $push :
{ "channelId" : '$_id.cId',
"value" :'$value',
"average" : '$average',
"maximun" : '$maximun',
"minimum" : '$minimum'
}}
}
}
]
)
方案二:
有 属性 我没有在我的原始问题中显示可能有帮助 "Channels.Id" 独立于 "Channels._Id"
db.records.aggregate( [
{
"$unwind" : "$Channels"
},
{
"$group" : {
"_id" : "$Channels.Id",
"documentSum" : { "$sum" : "$Channels.Value" },
"documentAvg" : { "$avg" : "$Channels.Value" }
}
}
] )
我需要获取子文档的 $sum 和 $avg,我想获取 Channels[0].. 以及其他频道的 $sum 和 $avg。 我的数据结构是这样的
{
_id : ... Location : 1,
Channels : [
{ _id: ...,
Value: 25
},
{
_id: ... ,
Value: 39
},
{
_id: ..,
Value: 12
}
]
}
为了获得集合中每个文档的 sum 和 average,您需要使用 mongodb 的 Aggregation processing. Further, since Channels
is an array you will need to use the $unwind 运算符解构数组。
假设您的集合名为 example
,您可以通过以下方式获得 Channels.Value
的文档总和和平均值:
db.example.aggregate( [
{
"$unwind" : "$Channels"
},
{
"$group" : {
"_id" : "$_id",
"documentSum" : { "$sum" : "$Channels.Value" },
"documentAvg" : { "$avg" : "$Channels.Value" }
}
}
] )
您的 post 数据的输出将是:
{
"_id" : SomeObjectIdValue,
"documentSum" : 76,
"documentAvg" : 25.333333333333332
}
如果您的集合中有多个文档,那么您会看到每个文档的结果行都包含一个 Channels
数组。
解决方案 1:根据此示例使用两个组: previous question
db.records.aggregate(
[
{ $unwind: "$Channels" },
{ $group: {
_id: {
"loc" : "$Location",
"cId" : "$Channels.Id"
},
"value" : {$sum : "$Channels.Value" },
"average" : {$avg : "$Channels.Value"},
"maximun" : {$max : "$Channels.Value"},
"minimum" : {$min : "$Channels.Value"}
}},
{ $group: {
_id : "$_id.loc",
"ChannelsSumary" : { $push :
{ "channelId" : '$_id.cId',
"value" :'$value',
"average" : '$average',
"maximun" : '$maximun',
"minimum" : '$minimum'
}}
}
}
]
)
方案二: 有 属性 我没有在我的原始问题中显示可能有帮助 "Channels.Id" 独立于 "Channels._Id"
db.records.aggregate( [
{
"$unwind" : "$Channels"
},
{
"$group" : {
"_id" : "$Channels.Id",
"documentSum" : { "$sum" : "$Channels.Value" },
"documentAvg" : { "$avg" : "$Channels.Value" }
}
}
] )