【问题标题】:Excluding design documents in _all_docs query in Cloudant在 Cloudant 的 _all_docs 查询中排除设计文档
【发布时间】:2017-08-23 04:54:05
【问题描述】:

我想检索除设计文档之外的所有文档,但_all_docs 返回数据库中的所有文档。从答案中,我发现使用两个查询会给出结果。

  1. _all_docs?endkey="_" - 列出第一个设计文档之前的文档
  2. _all_docs?startkey="design_\uffff" - 在设计文档之后列出文档

如果设计文档之后的文档具有_id“``test”,则这不起作用。 它给出了以小写字母开头的_id 的文档。

_的ASCII是95,反引号是96。小写字母以97开头。

那么上面的查询可以修改为:

_all_docs?startkey="`"

【问题讨论】:

    标签: couchdb cloudant design-documents


    【解决方案1】:

    _all_docs 端点确实返回了设计文档,这是非常正确的。由于 _ 字符位于数字 + 大写字母和小写字母之间,因此设计文档出现在以小写字母(或示例中的反引号)开头的文档之前。

    这让您有两个选择:

    1. 两次调用_all_docs 以获取设计文档“任何一方”的文档:

       GET /mydb/_all_docs?endkey="_"
       GET /mydb/_all_docs?startkey="`"
      
    2. 或者,创建一个新的MapReduce 视图。由于MapReduce 视图不索引设计文档,因此您可以在单个查询中获取所有文档(不包括设计文档)的列表。

    地图功能可以这么简单

    function(doc) {
      emit(doc._id, null);
    }
    

    使用GET /mydb/_design/report/_view/myalldocs查询视图

    【讨论】:

    • 您能进一步解释一下这种方法吗?我不明白如何“对 _all_docs 进行两次调用”。谢谢!
    • @CarCrazyBen 首先进行 API 调用 /_all_docs?endkey="_"。这将为您提供设计文档之前的所有文档。存储此结果。进行 API 调用 /_all_docs?startkey="`"。这将为您提供设计文档之后出现的所有文档。然后,结合两个 API 调用的结果。通过这种方式,您排除了设计文档以仅获取实际数据文档。如果您观察到,文档在 Cloudant 中按照 _id 字段字符的 ASCII 值顺序排列。
    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2018-06-22
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多