AQL:在运算符上绑定参数

AQL: Bind parameter on operator

有没有办法在运算符(“<”、“<=”等...)上绑定参数?我正在开发 Foxx 服务。

示例:

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 })

普通绑定参数(带一个@)只能用于值nulltruefalse、数字、字符串、数组和对象。 可以在指定集合名称的地方使用集合绑定参数(有两个 @@)。

在 AQL 中不可能通过绑定参数传递运算符,因为它可能会改变查询的含义,或使其完全无效。

考虑以下示例:

FOR v IN myCollection
FILTER v.value @operator @maxValue

这个查询甚至不解析,不管在绑定参数中传递了什么值。这是一件好事,因为否则可能会传递 @operator: "abc"@maxValue: ">=" 之类的内容,这意味着查询可以在没有绑定参数的情况下被很好地解析,但会在注入绑定参数时产生解析错误。

所以这里最简单的解决方案是通过模板字符串替换将比较运算符注入查询,当然你需要确保请求的比较运算符在允许的运算符白名单中。 但是即使使用绑定参数,您也需要执行此操作,否则人们可能只发送 @operator: "!="@operator: "NOT IN" 或其他您不希望或会使您的查询更昂贵的运算符。