使用 N1QL 保留字

Using N1QL reserved words

我有一个结构为 { doc.data.role.level } 的文档,我想访问级别 属性, 但是使用这个查询

SELECT r.data.role.level    FROM `hostel` r where r.id = '12345678Z' 

我收到错误消息

"msg": "syntax error - at role",

但是对于这些查询我没有得到任何结果

SELECT r.data.`role`.level  FROM `hostel` r where r.id = '12345678Z'
SELECT `r.data.role.level`  FROM `hostel` r where r.id = '12345678Z'    

你是在正确的轨道上用反引号转义保留字。

如果您没有收到错误消息,那么我怀疑这是您的 WHERE 子句。您确定您的文档中有 "id" 字段吗?

{ "id": "12345678Z", "foo": "bar", ... etc ... }

或者您是否尝试根据文档 ID 进行查询(在下面的屏幕截图中,文档中没有 "id" 字段)?

如果是后者,那么你应该使用META().id:

SELECT * FROM `testbucket` r where META(r).id = '12345678Z'

我知道这可能看起来有点令人困惑,但 "id" 并不是 Couchbase 中的魔法领域。这是一个和其他领域一样的领域。文档的实际 ID 在文档的 元数据 .

还有一个建议:如果你想通过它的 ID 获得一个单个文档,你最好使用key/value API 而不是 N1QL 查询。无需涉及 query/index 服务的开销。

如果 fields/identifiers 或保留关键字中有特殊字符,您必须按照 https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/identifiers.html

所述使用反引号(即转义标识符)对它们进行转义

示例 1: "role" 是保留关键字

{
 "id":"12345678Z",
 "data":{"role":{"level":3}}
}

SELECT r.data.`role`.level
FROM hostel AS r
WHERE r.id = "12345678Z";

示例 2: 字段有特殊字符点。您必须转义整个字段名称(以解释为字段与嵌套文档)。

{
 "id":"12345678Z",
 "data.role.level":5
}

SELECT r.`data.role.level`
FROM hostel AS r
WHERE r.id = "12345678Z";

示例 3: 旅馆是数组。如果您正在查看数组内部,则必须使用任何语法。

{
 "hostels": [ { "id":"12345678Z"},
              { "id":"34545678Z"}}
            ]
 "data":{"role":{"level":3}}
}

SELECT r.data.`role`.level
FROM hostel AS r
WHERE ANY h IN r.hostels SATISFIES h.id = "12345678Z" END;