ArangoDB AQL:绑定运算符上的参数

e37o9pze  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(135)

有没有办法在操作符上有绑定参数(“〈",“〈=”等)?我正在处理一个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 })
kulphzqa

kulphzqa1#

一般系结参数(具有一个@)只能用于值nulltruefalse、数字、字串、数组和对象。集合系结参数(具有两个@@)可用于指定集合名称的位置。
通过绑定参数传递操作符在AQL中是不可能的,因为它可能会改变查询的含义,或者使其完全无效。
请考虑以下示例:

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

这个查询甚至不进行解析,不管bind参数中传递了什么值。这是一件好事,因为否则可能会传递@operator: "abc"@maxValue: ">="之类的值,这意味着查询在没有bind参数的情况下也能很好地解析,但在注入bind参数的情况下会产生解析错误。
所以这里最简单的解决方案是通过模板字符串替换将比较运算符注入到查询中,当然您需要确保请求的比较运算符在允许的运算符的白名单中。因为否则人们可能只发送@operator: "!="@operator: "NOT IN"或其他运算符,而这些运算符要么是您不希望的,要么会使您的查询开销更大。

相关问题