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

在Couchbase Java查询DSL中,如何筛选不是来自ASCII字母表的属性名称?,couchbase,n1ql,Couchbase,N1ql,Couchbase查询应该支持filter where子句中属性名称的任何字符串 但是下面的查询没有返回任何字段名7、a和的值?。它确实适用于fieldName a的值 注意,我使用的是JavaDSLAPI,而不是直接使用N1ql OffsetPath statement = select("*").from(i(bucket.name())).where(x(fieldName).eq(x("$t"))); JsonObject placeholderValues = JsonObject.c

Couchbase查询应该支持filter where子句中属性名称的任何字符串

但是下面的查询没有返回任何字段名7、a和的值?。它确实适用于fieldName a的值

注意,我使用的是JavaDSLAPI,而不是直接使用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);
但是我的bucket确实有这些JSONObject中的每一个,包括那些具有不寻常属性名称的JSONObject,如未过滤的查询所示:

{"a":"a"}
{"#":"a"}
{"&":"a"}
{"":"a"}
{"?":"a"}
如何在查询中转义属性名称或以其他方式支持这些合法名称


此问题与有关,但与值有关,与字段名有关。

字段名被视为标识符。因此,需要背蜱来逃避它们,因此:

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

当然,对于$value的参数化,我的问题是关于属性名,而不是标识符。另外,官方文档说它可以是任何字符串。我的问题是关于过滤器,而不是您在这里显示的投影。此外,正如前面提到的,我在获取查询结果中的值方面没有问题。问题是在标识符应用JSON文件名时定义过滤器名称规则。相同的规则适用于查询中的任何位置。从默认值中选择*作为d,其中d=A.如果JavaDSLAPI不起作用,您可以直接使用来自Java的N1QL。如果您需要标识符,这就是我为标识符制作的。它会在您的表达式周围设置背景技巧,而像x这样的原始表达式则不会。一般来说,获取语句并在其上运行toString总是很有帮助的,它将为您提供原始生成的N1QL,并将其与您手动编写的内容进行比较,以便尽早发现任何惊喜。