【问题标题】:AQL: Bind parameter on operatorAQL:在运算符上绑定参数
【发布时间】:2020-05-27 10:45:26
【问题描述】:
有没有办法在运算符(“
例子:
const operator = '<'
const res = query`
FOR v IN myCollection
FILTER v.value ${operator} ${maxValue}
`
我可以用db._query 做到这一点:
const operator = '<'
const res = db._query('
FOR v IN myCollection
FILTER v.value ${operator} @maxValue'
{ maxValue: 100 })
【问题讨论】:
标签:
arangodb
aql
foxx
arangojs
【解决方案1】:
普通绑定参数(有一个@)只能用于值null、true、false、数字、字符串、数组和对象。
集合绑定参数(带有两个@@)可以在指定集合名称的地方使用。
在 AQL 中无法通过绑定参数传递运算符,因为它可能会改变查询的含义,或使其完全无效。
考虑以下示例:
FOR v IN myCollection
FILTER v.value @operator @maxValue
这个查询甚至不解析,不管绑定参数中传递了什么值。这是一件好事,因为否则可能会传递@operator: "abc"、@maxValue: ">=" 之类的内容,这意味着可以在没有绑定参数的情况下很好地解析查询,但在注入绑定参数时会产生解析错误。
所以这里最简单的解决方案是通过模板字符串替换将比较运算符注入到查询中,当然您需要确保请求的比较运算符在允许的运算符的白名单中。
但即使使用绑定参数,您也需要执行此操作,否则人们可能只发送 @operator: "!=" 或 @operator: "NOT IN" 或您不期望的其他运算符,或者这会使您的查询更加昂贵。