平均数组MongoDB

时间:2017-08-21 18:50:51

标签: mongodb

我在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

此致

1 个答案:

答案 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迭代真正发生了什么。但是您可以在产品环境中删除此属性。