使用 AQL 变量,例如进行计数(LET sum = sum + 1)

aug*_*n-s 5 arangodb

根据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 }
Run Code Online (Sandbox Code Playgroud)

我目前使用版本 2.4 但无法使用它,例如在这样的声明中:

LET sum = 0
FOR i in memoryColl
    LET sum = sum + 1
    // sum = sum + 1
    RETURN { "i": i, "sum": sum }
Run Code Online (Sandbox Code Playgroud)

我收到错误 [1511] 变量“sum”被分配多次(解析时)

有人可以告诉我这样的声明原则上是否应该起作用,以及具体如何起作用?

CoD*_*anX 2

正如 2.3 的升级文档中所述,不再可能更新查询中的变量:

以前版本的 ArangoDB 允许修改 AQL 查询中的变量 [...]

虽然这无疑是一个方便的功能,但新的查询优化器设计不允许保留它

此外,更新查询内的变量会阻止我们希望优化器对查询进行大量优化。此外,更新在集群中不同节点上运行的查询中的变量可能会导致不确定的行为,因为查询不是线性执行的。

要枚举文档,您可以这样做

LET range = 0..LENGTH(memoryColl)-1

FOR i IN range
    RETURN {i: i+1, doc: memoryColl[i]}
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎是一个非常糟糕的主意。最好把文件退回来,让客户一一列举。

如果你真的想统计文档的数量,你可以使用子查询:

LET result = (
    FOR doc IN memoryColl
        FILTER True // add some condition here for instance
        RETURN doc
)

RETURN LENGTH(result)
Run Code Online (Sandbox Code Playgroud)

在2.4中,还可以更有效地计数:
http://jsteemann.github.io/blog/2014/12/12/aql-improvements-for-24/