首页 文章

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

提问于
浏览
1

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

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

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

谢谢!

2 回答

  • 1

    来自文档:

    0 == null                 // false
    

    这暗示了其他比较运算符的相同行为 . 所以,是的,似乎是一个错误 . 非常奇怪 >= 有效但不是 <= ,你是否用负值测试了它,即 NULL >= -1 返回false?

    如果是,那么将doc.x <值替换为!(doc.x> = value)应该有效 .

    Edit :没关系 . 这不区分 doc.x == NULLdoc.x < value . )

    如果没有,你将不得不添加空检查,但如果你注意到因此而出现重大的性能提升,我会感到惊讶 .

  • 1

    我联系了ArangoDB开发人员,事实证明这种行为是按设计工作的 . 目前documentation实际上是清楚的,我有一段时间没有看过它 . 解决方法只是在需要的地方添加"doc.x != null"术语,但对于我们的特定用例,这是一个显而易见的问题 .

相关问题