1

我正在尝试实现一个非常基本的 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

存储桶只有 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 文档似乎也不是很详细。

任何帮助表示赞赏。

4

1 回答 1

0

如果具有复合键的视图实际上会被发布,那将会有所帮助!该代码实际上确实按预期工作。但是,让人们对查询/选项字符串的格式以及创建时是否应该进行 URL 编码的看法会很有趣。

更新: 在设置一个新的 Couchbase 服务器并使用相同的数据集填充它并重建它实际工作的视图之后。所以我不知道为什么它对原始服务器不起作用。我用细齿梳检查了 map 函数,并检查了所有变量和参数的正确拼写(大写/小写)。至少它确实有效。:)

于 2015-08-11T04:34:35.637 回答