有没有一种方法可以在操作符上绑定参数("<", "<="等等...) ? 我正在做一个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 })
正常的绑定参数(有一个 @
)只能用于 null
, true
, false
集合绑定参数(有两个):数字、字符串、数组和对象。@@
)可以用于指定集合名的地方。
在AQL中,通过绑定参数传递操作符是不可能的,因为它可能会改变查询的含义,或者使其完全无效。
考虑下面的例子。
FOR v IN myCollection
FILTER v.value @operator @maxValue
无论绑定参数中传递了什么值 这个查询都无法解析。这是件好事,因为如果不这样做,人们可能会传递一些类似于 @operator: "abc"
, @maxValue: ">="
这意味着查询在没有绑定参数的情况下可以正常解析,但在注入绑定参数后会产生解析错误,所以这里最简单的解决方案是通过模板字符串substituion将比较运算符注入到查询中,当然你需要确保请求的比较运算符在允许的运算符白名单中。
所以最简单的解决方案是通过模板字符串substituion将比较运算符注入到查询中,当然你需要确保所请求的比较运算符在允许的运算符的白名单中。但即使有绑定参数,你也需要这样做,否则人们可以直接发送 @operator: "!="
或 @operator: "NOT IN"
或其他你没有想到的操作符,或者会使你的查询更昂贵。