在Couchbase Java查询DSL中,如何过滤不是来自ASCII字母的属性名称?

时间:2019-03-25 13:10:38

标签: couchbase n1ql

Couchbase查询应支持过滤器(where子句中的属性名称的任何字符串。)

但是下面的查询未返回任何fieldNames "7", "a", "#", "&", "", "?"的值。确实适用于fieldName a的值。

请注意,我使用的是Java DSL API,而不是直接使用N1ql。

OffsetPath statement = select("*").from(i(bucket.name())).where(x(fieldName).eq(x("$t")));
JsonObject placeholderValues = JsonObject.create().put("t", fieldVal);
N1qlQuery q = N1qlQuery.parameterized(statement, placeholderValues);
N1qlQueryResult result = bucket.query(q);

但是我的存储桶确实有每个这些JsonObject,包括那些具有不寻常属性名称的JsonObject,如未经过滤的查询所示:

{"a":"a"}
{"#":"a"}
{"&":"a"}
{"":"a"}
{"?":"a"}

如何在查询中转义属性名称或以其他方式支持这些合法名称?

(此问题与another one有关,但这与值有关,而与字段名称有关。)

1 个答案:

答案 0 :(得分:1)

字段名称被视为标识符。因此,需要用反引号将其转义:

select("*").from(i(bucket.name())).where(x("`" + fieldName + "`").eq(x("$value"))

当然具有参数$value