ArangoDB:使用数字范围表达式评估 AQL 过滤器中未定义的键

ArangoDB: Evaluation of undefined keys in AQL filters with numeric range expressions

我需要针对具有高度可变文档结构的集合执行最终用户编写的复杂 AQL 过滤器表达式。这些过滤器表达式可能包含跨零的范围测试,例如 "doc.x < 10",但在这些情况下,没有定义字段 'x' 的文档将作为结果返回,因为 NULL 被解释为 0阿兰戈数据库。这可以通过写 "doc.x != NULL && doc.x < 10" 来避免;但是,这会导致额外的复杂性,尤其是当过滤器表达式开始时很复杂时。

奇怪的是,==、>、>= 运算符不转换 NULL 值 - 只有 <、<= 和 != 运算符。也许这是一个错误(使用版本 3.3.2)?

此行为至少可能会导致用户 confusion/frustration。因此,在我编写自己的查询预处理器来解决这个问题之前,我很好奇是否有办法禁用此默认 NULL AQL 行为(对于数字表达式)?

谢谢!

来自文档:

0 == null                 // false

这意味着其他比较运算符的行为相同。所以是的,似乎是一个错误。非常奇怪 >= 有效但 <= 无效,您是否也使用负值测试过它,即 NULL >= -1 return 是否为假?

如果是,则将 doc.x < value 替换为 !(doc.x >= value) 应该可以。

(编辑:没关系。这不区分doc.x == NULLdoc.x < value。)

如果没有,您将不得不添加空值检查,但如果您因此注意到显着的性能提升,我会感到惊讶。

我联系了 ArangoDB 开发人员,结果发现这种行为是 working-as-designed。当前的documentation其实很清楚,只是好久没看而已。 work-around 只是在需要的地方添加 "doc.x != null" 项,但对于我们的特定用例来说,这有点令人费解。