3

sum() 等聚合函数的语法到底是什么?

例如,采用以下结构:

let json = {
    "ages": {
    "age": [
    "20",
    "30",
    "40"
    ]
    }
}

然后

for age in json.ages.age return age

返回

 ["20", "30", "40"]

以下所有片段在 Arango 2.0.4 中返回“[1542] 在调用函数 'SUM()' 时使用的无效参数类型”:

// LR
let ages = (for age in json.ages.age return age)
return sum(ages)

// LR
let ages = (
    for age in json.ages.age  
    return age
)
return sum((for age in json.ages.age return age))

// R
return sum((for age in json.ages.age return age))

什么是正确的语法?

语法页面 ( http://www.arangodb.org/manuals/current/Aql.html#AqlFunctionsList ) 似乎没有任何相关示例。

我能找到的最接近语法示例的是:https ://www.arangodb.org/foxx

controller.get("/revenue/:year", function (req, res) {
  var query = "RETURN SUM((FOR bill IN billcollection FILTER bill.year == @year     RETURN     bill.amount))"; 
  var stmt = db._createStatement({ "query": query});
  stmt.bind("year",parseInt(req.params("year"),10));
  var c = stmt.execute();
  res.json(c);
});

但似乎上面的语法对我来说是失败的。

任何地方都有更详细的语法参考吗?

4

1 回答 1

4

您的方法是正确的,但是您错过了文档中的一个小地方。;)

在 SUM() 的文档中它说:

SUM(list) :返回列表中值的总和。这要求列表中的元素是数字。空值被忽略。

(文档参考:https ://www.arangodb.org/manuals/current/Aql.html#AqlFunctionsList )

注意“这要求列表中的元素是数字”

因此,您的 JSON 示例应该在列表中包含数字,而不是字符串。

let json = {
    "ages": {
    "age": [
        20,
        30,
        40
    ]
    }
}

let ages = (for age in json.ages.age return age)
return sum(ages)

将上面的代码片段复制并运行到您的 AQL 编辑器中应该会产生所需的结果:

[
  90
]

当然,您也可以保持 json 不变,并通过相应地更改 AQL 查询将字符串类型转换为数字:

let json = {
    "ages": {
    "age": [
        "20",
        "30",
        "40"
    ]
    }
}

let ages = (for age in json.ages.age return TO_NUMBER(age))
return sum(ages)
于 2014-04-24T07:05:54.017 回答