我在MongoDB中有这个集合
{
{"values" : [1,2,3,4,5,6]},
{"values" : [7,8,9,10,11,12]},
{"values" : [13,14,15,16,17,18]}
}
如何通过索引聚合并获取平均数组?
像这样:
{ "average" : [7,8,9,9.66,10.66,12] }
注意:平均[0] =(1 + 7 + 13)/ 3
此致
答案 0 :(得分:1)
您可以使用聚合框架和 $ avg 。
$ avg可以在$ project或$ group中使用。
https://docs.mongodb.com/manual/reference/operator/aggregation/avg/
使用单个表达式作为其操作数,如果表达式解析为 一个数组,$ avg遍历到数组中以对数字进行操作 要返回单个值的数组元素。有一个清单 表达式作为其操作数,如果任何表达式解析为 数组,$ avg不会遍历数组,而是处理数组 数组作为非数值。
更新#2: 既然问题现在更清楚了,我会更新我的答案。
db.stackoverflow027.aggregate([
{
$match: {
"message.testnr":"1111"
}
},
{
$unwind: {
path: "$message.content.deflection",
includeArrayIndex: "position"
}
},
{
$group: {
_id: "$position",
averageForIndex: {$avg: "$message.content.deflection"}/*,
debug_totalIndexInvolvedInTheAverage: {$sum: 1},
debug_valueInvolvedInTheAverage: {$push: "$message.content.deflection"},
debug_documentInvolvedInTheAverage: {$push: "$$ROOT"}*/
}
},
{
$sort: {_id:1}
},
{
$group: {
_id: null,
average: {$push: "$averageForIndex"}
}
}
], { allowDiskUse: true });
这将为您提供此输出:
{
"_id" : null,
"average" : [
6.0,
7.0,
8.0,
9.0,
10.0
]
}
我还添加了{ allowDiskUse: true }以避免内存限制(检查链接是否有更多信息)。 希望你的问题得到解决。
你可以看到一些“debug_”属性,以便让你有机会弄清楚$ group迭代真正发生了什么。但是您可以在产品环境中删除此属性。