使用 AQL 变量,例如用于计数(LET sum = sum + 1)
Use AQL Variables e.g. for counting (LET sum = sum + 1)
根据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' 被赋值多次(解析时)
有人能告诉我这样的声明原则上是否有效,具体如何?
如 2.3 的 upgrading docs 中所述,无法再更新查询中的变量:
Previous versions of ArangoDB allowed the modification of variables inside AQL
queries [...]
While this is admittedly a convenient feature, the new query optimizer design did not
allow to keep it.
Additionally, updating variables inside a query would prevent a lot
of optimizations to queries that we would like the optimizer to make. Additionally,
updating variables in queries that run on different nodes in a cluster would like cause
non-deterministic behavior because queries are not executed linearly.
要枚举文档,您可以这样做
LET range = 0..LENGTH(memoryColl)-1
FOR i IN range
RETURN {i: i+1, doc: memoryColl[i]}
但我觉得这真是个坏主意。最好return文档,让客户列举。
如果你真的想统计文档的数量,你可以使用子查询:
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/
在 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
}
]
根据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' 被赋值多次(解析时)
有人能告诉我这样的声明原则上是否有效,具体如何?
如 2.3 的 upgrading docs 中所述,无法再更新查询中的变量:
Previous versions of ArangoDB allowed the modification of variables inside AQL queries [...]
While this is admittedly a convenient feature, the new query optimizer design did not allow to keep it.
Additionally, updating variables inside a query would prevent a lot of optimizations to queries that we would like the optimizer to make. Additionally, updating variables in queries that run on different nodes in a cluster would like cause non-deterministic behavior because queries are not executed linearly.
要枚举文档,您可以这样做
LET range = 0..LENGTH(memoryColl)-1
FOR i IN range
RETURN {i: i+1, doc: memoryColl[i]}
但我觉得这真是个坏主意。最好return文档,让客户列举。
如果你真的想统计文档的数量,你可以使用子查询:
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/
在 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
}
]