AQL: 绑定运算符上的参数

问题描述 投票:1回答: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 })

arangodb aql foxx arangojs
1个回答
1
投票

正常的绑定参数(有一个 @)只能用于 null, true, false集合绑定参数(有两个):数字、字符串、数组和对象。@@)可以用于指定集合名的地方。

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

考虑下面的例子。

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

无论绑定参数中传递了什么值 这个查询都无法解析。这是件好事,因为如果不这样做,人们可能会传递一些类似于 @operator: "abc", @maxValue: ">="这意味着查询在没有绑定参数的情况下可以正常解析,但在注入绑定参数后会产生解析错误,所以这里最简单的解决方案是通过模板字符串substituion将比较运算符注入到查询中,当然你需要确保请求的比较运算符在允许的运算符白名单中。

所以最简单的解决方案是通过模板字符串substituion将比较运算符注入到查询中,当然你需要确保所请求的比较运算符在允许的运算符的白名单中。但即使有绑定参数,你也需要这样做,否则人们可以直接发送 @operator: "!="@operator: "NOT IN" 或其他你没有想到的操作符,或者会使你的查询更昂贵。

© www.soinside.com 2019 - 2024. All rights reserved.