【问题标题】:How to retrieve data by document key in couchbase如何通过沙发库中的文档键检索数据
【发布时间】:2014-12-20 05:29:08
【问题描述】:

假设我们有一个存储在 couchbase 中的文档:

{
   "type": "Application",
   "policies": [
       "p1",
       "p2"
   ],
   "title": "app1",
   "uuid": "03765cd7-4dcd-4ed0-9586-05acf2e845ad"
}

我创建了一个发出所有策略的视图:

function (doc, meta) {
  if (doc.type && doc.type == "Application") {
    for (var i in doc.policies) {
      emit(doc.policies[i], doc.title);
    }
  }
}

为了测试这一点,我查询了 localhost:8092/default/_design/dev_DesignName/_view/ViewName?stale=false&inclusive_end=false&connection_timeout=60000&limit=10&skip=0 成功列出

{"total_rows":2,"rows":[
  {"id":"03765cd7-4dcd-4ed0-9586-05acf2e845ad","key":"p1","value":"app1"},
  {"id":"03765cd7-4dcd-4ed0-9586-05acf2e845ad","key":"p2","value":"app1"}
]}

到目前为止一切顺利。

问题:如何过滤结果,比如key=p1

我尝试了各种查询后缀组合,包括:

  • ...&key=p1
  • ...&key="p1"
  • ...&key={p1}
  • ...&key={"key":"p1"}

这些都不起作用 - 前三个是因为 JSON 语法错误,而最后一个只是导致空结果。我错过了什么?

额外问题:拥有这种配置,设置交集的最佳方法是什么,即

  • 如果application1"policies" : ["p1", "p2"]
  • application2"policies" : ["p2", "p3"]
  • application3"policies" : ["p3", "p4"]

然后

  • 如何从具有p2 p3 策略的应用程序中获取 uuid?
  • 如何从具有 p2 p3 策略的应用程序中获取 uuid?

编辑:事实证明,通过 String 键查询可与 Java API 一起使用(带回正确的行)。知道我在 REST API 尝试中遗漏了什么仍然会很有趣。

【问题讨论】:

  • 你试过 CB admin web 控制台视图执行吗?您可以在其中指定顺序和过滤条件(如开始键、结束键)。

标签: json couchbase data-retrieval


【解决方案1】:

正如之前的用户所描述的。您可以在 Couchbase 管理 UI 的 Views->Development Views 下为给定的存储桶测试所有这些。它还将生成一个可用于测试的 REST 查询。 您可能还想尝试一下“startKey”和“endKey”。我正在整理一篇博文,完成后将在此处发布,其中包含几个示例和 N1QL。

【讨论】:

  • 查询 is 实际上是从管理控制台复制的。我唯一添加的是key
【解决方案2】:

回答

key="p1" 是正确的尝试,因为密钥必须是有效的 JSON,并且因为您在这里发出字符串,所以应该用双引号引起来。但似乎keyinclusive_end 参数敏感,当您在UI 中设计查询时默认为false。因此,只需在此处取消选中它即可查看您的密钥:

奖励答案

实现 OR 在这里很容易,只需使用 keys= 参数枚举键:

$ curl 'http://localhost:8092/default/_design/test/_view/test?inclusive_end=true&keys=%5B"p2","p3"%5D'
{"total_rows":6,"rows":[
{"id":"03765cd7-4dcd-4ed0-9586-05acf2e845a1","key":"p2","value":"app2"},
{"id":"03765cd7-4dcd-4ed0-9586-05acf2e845ad","key":"p2","value":"app1"},
{"id":"03765cd7-4dcd-4ed0-9586-05acf2e845a1","key":"p3","value":"app2"},
{"id":"03765cd7-4dcd-4ed0-9586-05acf2e845a2","key":"p3","value":"app2"}
]
}

keys 参数,也应该是有效的 JSON,这里是 ["p2","p3"]。当您使用 POST 请求时,您不必对其进行 URL 编码。当然,当您通过其 API 设置 keys 时,您不必使用这些编码:

ViewQuery query = ViewQuery.from("test", "test")
        .keys(JsonArray.empty().add("p2").add("p3"));

但实现 AND 会有点棘手,但如果您修改视图而不是每个策略发出一次,您的映射器应该生成所有可能的组合,并且您需要指定所需的组合查询中的要求。为了减少空间,您的应用程序可能会假设在这种情况下键集和查询都是有序的。

【讨论】:

  • N1QL 可能用于“AND”子句。使用传统方法的单个查询调用无法做到这一点。
猜你喜欢
  • 2015-03-03
  • 2011-01-15
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多