【问题标题】:Querying Couchbase using N1QL使用 N1QL 查询 Couchbase
【发布时间】:2015-09-15 07:06:02
【问题描述】:

我可以很好地使用视图查询文档,但切换到 N1QL 会使我的 Success 属性为 false。什么地方出了错 ?

    let cluster = new Cluster()
    let bucket = cluster.OpenBucket("mydoc","")
    let query = """SELECT * FROM mydoc where SET = 'SET24MM2SCLV01'"""
    let result = bucket.Query(query)
    Console.WriteLine(result.Success) //would give false

【问题讨论】:

  • 您是否尝试直接运行查询,例如使用 cbq?它成功了吗?它是否返回错误消息?
  • BTW SET 是 N1QL 中的关键字。尝试在查询中使用它会返回语法错误。您的mydoc 文档是否真的有SET 属性?
  • 我正在从 mongodb 移植数据库 :) 所以..

标签: f# couchbase n1ql


【解决方案1】:

SET 是 N1QL 中的 reserved word。为了将其用作标识符,您需要使用反引号对其进行转义,例如:

SELECT * FROM mydoc where `SET` = 'SET24MM2SCLV01'

如果你不这样做,你会得到一个语法错误:

"errors": [
    {
        "code": 3000,
        "msg": "syntax error - at SET"
    }
]

您应该将查询更改为

让 query = """SELECT * FROM mydoc where SET = 'SET24MM2SCLV01'"""

let query = "SELECT * FROM mydoc where `SET` = 'SET24MM2SCLV01'"

编辑

查询结果also containsError 属性以及查询中出现的错误。如果 Success 返回 false,则应始终检查这一点。如果即使在转义 SET 后查询仍然失败,这将解释导致查询无法运行的其他错误。

例如,我刚刚注意到整个查询用双引号括起来。这将向服务器发送字符串文字而不是查询。

【讨论】:

  • 我已将键名更改为其他名称,但仍无法运行查询。顺便说一句,我如何从“cbq”做到这一点?
  • 结果还包含一个Error 属性。检查它以查看实际错误是什么。 cbq 是 Couchbase 的命令行工具。如果您不能使用它,只需使用您必须执行的任何工具来执行查询,以便您可以检查错误消息。不知道哪里出了问题,就无法修复。
  • @himekami 一个更严重的问题 - 您将查询用引号括起来,将其转换为字符串文字而不是查询。
  • 非常感谢。我按照你的建议使用了 cbq 工具,我得到了这个错误代码 4000。所以我定义了主索引键。然后当我再次使用 cbq 测试时,返回结果是成功的。我还按照建议更改了查询文字。效果很好。太好了!
猜你喜欢
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多