【发布时间】:2015-08-11 04:03:49
【问题描述】:
我正在尝试实现一个非常基本的 C 应用程序,该应用程序使用 C SDK 查询 Couchbase 视图。我让 SDK 能够正常工作,因为我可以从数据库服务器检索数据,甚至可以使用范围查询(startkey 和 endkey)查询视图。但是,如果我使用复合键创建视图,即具有两个值的索引,那么我将一无所获。如果我在 PHP 或 Node 中实现相同的视图,我会得到正确的数据。我对 C SDK 的理解是它使用了 Couchbase 的 REST API,所以选项字符串 (optstr) 与我使用 Couchbase 内置的 Web 管理控制台基本相同。使用单个数字开始和结束键,我就可以正常工作了,但是一旦我开始使用复合键,比如
startkey=["test",2]&endkey=["test",4]
我没有得到任何结果。确实返回数据的查询字符串看起来像
startkey=2&endkey=4
bucket只有5个文档,结构如下:
{number: 1, name: "test"}
数字只是介于 1 和 5 之间。
复合键的视图如下所示:
function (doc, meta) {
emit([doc.name, doc.number], doc);
}
单键的那个只是将 doc.number 作为发出中的第一个值,而不是一个数组。
我在 C 中用于复合键的代码如下所示:
lcb_CMDVIEWQUERY vq = {0};
vq.optstr = "startkey=[\"test\",2]&endkey=[\"test\",4]";
vq.noptstr = strlen(vq.optstr);
lcb_view_query_initcmd(&vq, "ddoc", "myView", NULL, viewCallback);
lcb_error_t rc = lcb_view_query(instance, NULL, &vq);
复合视图缺少什么? Couchbase 网站上的示例不包含使用任何键的视图,并且其 Git 存储库中的示例也没有任何示例。 Couchbase C SDK 的文档似乎很简陋,甚至 API 文档似乎也不是很详细。
感谢任何帮助。
【问题讨论】:
-
返回的结果与网页版和其他SDK相比是空的,视图都是创建和发布的,因为我通过PHP成功使用它们。我只需要集成一个用 C/C++ 编写的应用程序
-
没有关于查询复杂键的文档的原因是您的代码应该可以正常工作。您使用的是什么版本的库?
-
我也认为代码应该可以正常工作。我在 CentOS 7 上使用 libcouchbase2 v2.5.2-1。Couchbase 服务器本身的版本是 3.0.3-1716。该代码返回一个空数据集,但 Web 界面返回预期的 2 个文档。
-
没有错误?如果您直接使用 HTTP 提供字符串会怎样? (即通过 curl)
-
我刚刚尝试使用 beer-sample 桶重现类似的用例。它工作正常,没有问题。请确保您正在从回调中收集任何错误信息。从描述看来,库可能错误地转义了参数(并且可能在不应该的地方应用了百分比编码)。最后,如果您在创建存储桶或插入项目后立即运行视图,则视图可能没有机会更新 - 查看
stale查询参数