【问题标题】:CouchDB key always matchesCouchDB 键始终匹配
【发布时间】:2011-01-17 01:32:34
【问题描述】:

我希望以这样一种方式查询我的 CouchDB,文档中的某些字段可以是匹配任何键请求的通配符。

例子:

function(doc) {
  emit(doc.some_field, doc);
}

?key=100 将匹配具有 100some_fieldsome_field 值(如 *)的文档。

这可能吗?有没有办法做到这一点?

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    根据CouchDB documentation,您可以这样做:

    ?startkey="key"&endkey="key\ufff0"
    

    匹配*.

    【讨论】:

    • 如果我正确理解了这个问题,作者不想使用通配符进行查询。他需要视图的行在其键中包含通配符。 OT:感谢您在 couchdb 等方面所做的工作 :)
    • 对,我需要我传入的任何键最终匹配存储在数据库中的某个通配符键。我知道这可能听起来很奇怪......但是对于一个包管理器来说,它能够询问为 X、Y 和 Z 的系统属性编译的所有包,但有些包是通用的,可能在 X 和 Y 上匹配但没有 Z但是它们的通用字段标记为 *.
    • 啊,对不起,我误解了这个问题。如果您的 POST 正文如下所示,您可以对视图使用 POST 请求来获取许多键的逻辑 OR:{"keys": ["key1", "key2", ...]} 请参阅 wiki.apache.org/couchdb/HTTP_view_API
    • 嗯,如果我能以某种方式将它与开始键和结束键结合起来,那它实际上会起作用。因为我还需要在键中使用通配符。
    • issues.apache.org/jira/browse/COUCHDB-523 -- 但我猜你,Jan,已经知道了:)
    【解决方案2】:

    来自 Couchdb wiki:

    CouchDB 实际上存储了 [key,docid] 对作为 btree。这意味着:

    • 您始终知道键和值来自哪个文档(它在视图结果中显示为“id”字段)
    • 查看具有相同键的行按增加 docid 排序。

    所以我不认为用作键的一部分的通配符字段是可能的,因为它们是排序的。假设它们是可能的。然后,如果您尝试从视图中查询键范围,则将返回带有通配符的行以及任何键范围。这意味着它们无处不在。但这是不可能的,因为它们是排序的。即带有通配符的行被放置在一对其他行之间,其中一个具有较大的键,而另一个具有较小的键。

    【讨论】:

    • 是的,我想如果有某种方式可以做 OR,虽然那会起作用。像 100 或 *。我可能不得不使用 couchdb-lucene。
    • 使用两个请求可以作为一种解决方法:第一个请求为您的密钥 (?key=100),第二个请求为通配符行。如果当然通配符行需要有相邻的键。
    • wiki.apache.org/couchdb/… 说一切皆有可能:)
    • @Jan 如果我正确理解了这个问题,那么我的答案的-1 就太过分了。但是我应该提到这个基于排序规则的技巧。
    • 弄错了,请参阅我的答案中的 cmets。不知道如何让我删除 -1。
    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多