【问题标题】:Composite key with CouchDB, finding multiple records使用 CouchDB 的复合键,查找多条记录
【发布时间】:2011-09-04 02:45:06
【问题描述】:

我知道你可以传递一个键或一个范围来返回 CouchDB 中的记录,但我想做这样的事情。查找 X 值的 X 记录。

例如,在常规 SQL 中,假设我想返回 ID 为 5、7、29、102 的记录。我会这样做:

SELECT * FROM sometable WHERE id = 5 OR id = 7 or id = 29 or id = 102

是否可以在 CouchDB 中执行此操作,我将所有想要在键数组中查找的值都扔掉,然后 CouchDB 搜索所有可能存在于 “键参数”中的记录 em>?

【问题讨论】:

    标签: database search nosql couchdb composite-key


    【解决方案1】:

    您可以发帖as documented on CouchDB wiki。您在请求正文中传递键列表。

    {"keys": ["key1", "key2", ...]}
    

    缺点是 POST 请求不会被浏览器缓存。

    或者,您可以使用带有keys 参数的GET 获得相同的响应。例如,您可以使用以下命令查询视图_all_docs

    /DB/_all_docs?keys=["ID1","ID2"]&include_docs=true
    

    正确编码的 URL 变成:

    /DB/_all_docs?keys=%5B%22ID1%22,%22ID2%22%5D&include_docs=true
    

    这应该会提供更好的缓存能力,但请记住,_all_docs 在每次文档更新时都会发生变化。有时,您可以通过仅使用所需文档定义自己的视图来解决此问题。

    【讨论】:

    • 而且性能与一个查询不同(即使对于一系列键)。在内部,CouchDB 只是重新运行每个键的查找。您所节省的只是往返 HTTP 延迟。 (而且你的代码可能更简单,错误更少。)
    【解决方案2】:

    使用直视功能,这是不可能的。但是,您可以使用_list 函数来实现相同的结果。

    【讨论】:

    • 您可以在任何视图(甚至 _all_docs)上执行此操作,但您需要执行 POST 而不是 GET。
    • 使用键列表发布是一种解决方法。它不是语法糖,即相同但更方便。这是一回事。在内部,CouchDB 逐个查找每个键。性能和可伸缩性与 GET 键(或键范围)查找不同。然而,正如 Marcello 在他的回答中所表明的那样,这确实非常方便。
    • 我认为这取决于键列表是否始终相同,或者您是否希望能够在“运行时”指定键列表。如果列表是固定列表,您可以创建一个返回匹配文档的单个索引(_list 函数)。如果列表是任意的(一个参数),那么 couchdb 无论如何都必须为每个键“运行查找”,所以你不能比 POST 方法更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2014-03-21
    • 2019-04-19
    相关资源
    最近更新 更多