1

有没有办法在运算符(“<”,“<=”等...)上使用绑定参数?我正在开发 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 })

4

1 回答 1

1

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

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

考虑以下示例:

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

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

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

于 2020-05-27T11:09:56.200 回答