根据https://www.arangodb.com/2014/07/13/arangodb-2-2-0-released,可以使用这样的语句:
LET sum = 0
FOR v IN values
SORT v.year
LET sum = sum + v.value
RETURN { year: v.year, value: v.value, sum: sum }
我目前使用2.4版但无法使用它,例如在这样的声明中:
LET sum = 0
FOR i in memoryColl
LET sum = sum + 1
// sum = sum + 1
RETURN { "i": i, "sum": sum }
我收到了错误 [1511]变量' sum'被分配多次(在解析时)
有人可以告诉我,这样的状态原则上是否应该起作用,以及究竟是如何工作的?
答案 0 :(得分:1)
如2.3 upgrading docs中所述,不再可能更新查询中的变量:
以前版本的ArangoDB允许修改AQL中的变量 查询[...]
虽然这是一个方便的功能,但新的查询优化器设计却没有 允许保留。
此外,更新查询中的变量可以防止很多 对我们希望优化器制作的查询进行优化。另外, 更新在群集中不同节点上运行的查询中的变量 非确定性行为因为查询不是线性执行的。
要枚举文档,您可以
LET range = 0..LENGTH(memoryColl)-1
FOR i IN range
RETURN {i: i+1, doc: memoryColl[i]}
但对我来说这看起来真的很糟糕。最好返回文档并让客户端枚举它们。
如果您确实想要计算文档数量,可以使用子查询:
LET result = (
FOR doc IN memoryColl
FILTER True // add some condition here for instance
RETURN doc
)
RETURN LENGTH(result)
在2.4中,也可以更有效地计算:
http://jsteemann.github.io/blog/2014/12/12/aql-improvements-for-24/
答案 1 :(得分:0)
在2020年的arango 3.7上,您可以执行类似here
的操作LET values = [
{ year: 2019, value: 35 },
{ year: 2017, value: 8 },
{ year: 2018, value: 17 },
{ year: 2020, value: 84 }
]
LET sortedValues = (FOR v IN values SORT v.year RETURN v)
FOR i IN 0..LENGTH(sortedValues)-1
LET v = sortedValues[i]
LET sum = sortedValues[i].value + SUM(SLICE(sortedValues, 0, i)[*].value)
RETURN {year:v.year,value:v.value,sum:sum}
此返回
[
{
"year": 2017,
"value": 8,
"sum": 8
},
{
"year": 2018,
"value": 17,
"sum": 25
},
{
"year": 2019,
"value": 35,
"sum": 60
},
{
"year": 2020,
"value": 84,
"sum": 144
}
]