Arangodb 使用AQL变量,例如用于计数(让sum=sum+;1)
根据规定,可以使用如下语句:Arangodb 使用AQL变量,例如用于计数(让sum=sum+;1),arangodb,Arangodb,根据规定,可以使用如下语句: 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
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”被赋值多次(解析时)
有人能告诉我这样一个statemtn原则上是否应该工作,具体工作原理是什么吗?如for 2.3中所述,在查询中不再可能更新变量:
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中,也可以更有效地计数:在2020年的arango 3.7上,您可以执行以下操作 这又回来了
[
{
"year": 2017,
"value": 8,
"sum": 8
},
{
"year": 2018,
"value": 17,
"sum": 25
},
{
"year": 2019,
"value": 35,
"sum": 60
},
{
"year": 2020,
"value": 84,
"sum": 144
}
]
谢谢你的解释。所以,这个话题对我来说已经结束了。但正如一句话:当然,计数也可以用其他方式进行——这个例子只是为了简化问题。我最初想到的例子是,这些可更新的变量可以极大地帮助表达/缩短必要的计算,特别是与过滤器相结合,当变量获得某个值时,过滤器会停止计算,等等。但我很清楚,这将禁用其他优化和并行,因此您的优先级对我来说也很清楚。==>再次感谢您的回答。您可能想查看ArangoDB actions/Foxx,如果您真的需要这些功能,它们允许在数据库中运行自定义JavaScript代码——但我担心在性能方面或多或少会有相同的缺点。
[
{
"year": 2017,
"value": 8,
"sum": 8
},
{
"year": 2018,
"value": 17,
"sum": 25
},
{
"year": 2019,
"value": 35,
"sum": 60
},
{
"year": 2020,
"value": 84,
"sum": 144
}
]