以下是我要解决的问题:
数据结构很难改变,我无法承担迁移+我仍然需要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
也许不支持将数组元素加在一起,但这看起来很奇怪......
感谢您的帮助!
答案 0 :(得分:1)
来自docs,
$ add表达式具有以下语法:
{$ add:[
<expression1>
,<expression2>
,...]}参数可以是任何有效的表达式,只要它们解析为 要么是所有数字,要么是数字和日期。
它明确指出$add
运算符只接受数字或日期。
$my_array.1
解析为空数组。例如,[]
。 (您始终可以在特定索引中查找匹配项,例如{$match:{"a.0":1}}
,但无法从数组的特定索引派生值。为此,您需要使用$
或{{1 }}}。这是一个尚未解决的问题:JIRA1,JIRA2)
$slice
表达式变为$add
。
$add:[[],[],[],..]
不将数组作为输入,因此您会收到错误消息,指出它不支持将Array作为输入。
您需要做的是:
$add
文件。Match
my_array字段。Unwind
根据每个文档的Group
一起获得总和
跳过第一个元素的数组中的所有元素。_id
每个分组文档的求和字段。Project
根据条件获得总和的文件。舞台操作员:
group