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

问题描述 投票:4回答:2

根据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'被多次分配(解析时)

有人可以告诉我这样的状态原则上是否应该起作用,以及如何精确地起作用?

arangodb
2个回答
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/


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
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.