Couchbase查询应该支持过滤器中的property-name的任何String(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有关,但这与价值观有关,这与字段名称有关。)
字段名称被视为标识符。因此,需要使用反向标记来逃避它们:
select("*").from(i(bucket.name())).where(x("`" + fieldName + "`").eq(x("$value"))
当然,还有$value
的参数化