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
  }
]