N1QL查询有一个过滤器WHERE myField < $value
。
从实验开始,我看到Couchbase按以下方式对这些类型进行排序:boolean <integer <string <JsonArray,尽管从我的角度来看它们不应该具有可比性。
例如,任何布尔值的值都小于任何整数;任何整数都小于所有字符串。 (9223372036854775807
(Long.MAX_VALUE
)评估为低于""
(空字符串)。)
我想避免这种类型强制。我希望"A" < 1
和"A" > 1
是false
而不是从过滤器返回这些值。 (而且,似乎在Javascript中,这两个表达式都是false
,因为它们应该是。)
什么是强制规则?我该如何防止这种情况?
您已经发现了N1QL的归类顺序。这是一个更全面的解释:
https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/datatypes.html
如果要避免跨类型进行此比较,可以使用TYPE()函数添加子句,以验证要比较的两个元素是否属于同一类型。
https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/typefun.html
所以,而不是有$A > 3
你会有($A > 3) AND (TYPE($A) = TYPE(3))
。