如何在mongodb聚合中将数组元素的子集加在一起?

时间:2014-12-08 19:01:39

标签: mongodb aggregation-framework

以下是我要解决的问题:

  • 每个文档包含30个整数的数组
  • 文件按特定条件分组(此处不相关)
  • 在分组时,我想:
    • 将每个文档的最后29个元素(跳过第一个元素)加在一起
    • 将同一组中的上一个结果相加,并将其返回

数据结构很难改变,我无法承担迁移+我仍然需要30个值用于其他目的。这是我尝试过的,但未成功:

db.collection.aggregate([
    {$match: {... some matching query ...}},
    {$project: {total_29_last_values: {$add: ["$my_array.1", "$my_array.2", ..., "$my_array.29"]}}},
    {$group: {
        ... some grouping here ...
        my_result: {$sum: "$total_29_last_values"}
    }}
])

理论上(恕我直言)这应该有用,考虑到mongodb文档中$ add的定义,但由于某种原因它失败了:

exception: $add only supports numeric or date types, not Array

也许不支持将数组元素加在一起,但这看起来很奇怪......

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

来自docs

  

$ add表达式具有以下语法:

     

{$ add:[<expression1><expression2>,...]}

     

参数可以是任何有效的表达式,只要它们解析为   要么是所有数字,要么是数字和日期。

它明确指出$add运算符只接受数字或日期。

$my_array.1解析为数组。例如,[]。 (您始终可以在特定索引中查找匹配项,例如{$match:{"a.0":1}},但无法从数组的特定索引派生值。为此,您需要使用$或{{1 }}}。这是一个尚未解决的问题:JIRA1JIRA2

$slice表达式变为$add

$add:[[],[],[],..] 将数组作为输入,因此您会收到错误消息,指出它不支持将Array作为输入。

您需要做的是:

  • $add文件。
  • Match my_array字段。
  • Unwind根据每个文档的Group一起获得总和 跳过第一个元素的数组中的所有元素。
  • _id每个分组文档的求和字段。
  • 再次Project根据条件获得总和的文件。

舞台操作员:

group