CouchDB、all_docs 和使用 endkey 过滤设计文档

Posted

技术标签:

【中文标题】CouchDB、all_docs 和使用 endkey 过滤设计文档【英文标题】:CouchDB, all_docs and filter design documents with endkey 【发布时间】:2014-05-09 10:04:29 【问题描述】:

首先,这个问题 - 来自 all_docs 的过滤设计文档 - 似乎已经像这里描述的那样得到了解决: https://plus.google.com/+JasonDeRose/posts/1iP5tu3wVqw

/mydb/_all_docs?endkey=%22_%22

并首先工作。但是,突然在不同的设置中(实际上只是不同的部署),查询只返回一个空集合 []。似乎顺序发生了变化,没有 endkey="_" 返回完整的集合(包括设计文档)。我尝试了 endkey/startkey 的各种组合,但无法再次过滤设计文档。

最后我添加了一个过滤器并切换到 _changes?include_docs=true 来加载初始文档。我也考虑过定义一个视图,但不喜欢这会导致数据复制和更改源的一些不便(在另一个上下文中需要)。另一方面,过滤器将针对每个文档执行。

endkey=%22_%22 不再起作用是一个错误吗?有没有更方便,仍然有效的方法?

【问题讨论】:

【参考方案1】:

/_all_docs 是 CouchDB 的一个特例。它使用 ASCII 排序规则,而不是普通的 Unicode 排序规则。

ASCII 顺序中的“_”字符显示在大写字母和小写字母之间。因此,如果您的文档 ID 以小写字母开头(默认行为),它们将显示在 任何设计文档之后。如果您的文档 ID 以大写字母开头,它们将显示在设计文档之前。

尝试创建一个 id 为“ABC”的文档,您会看到它在设计文档之前出现,并且您过滤设计文档的技巧在这种情况下会起作用。

但是,我建议您完全停止使用 `_all_docs 视图。而是使用普通视图功能。当您创建视图时,CouchDB 会自动为您跳过设计文档。因此,如果您的视图如下所示:

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

您可以在没有开始或结束键的情况下查询它,并在没有设计文档的情况下获取所有文档。

另外,请查看 Unicode 排序顺序,这是所有其他视图的顺序,在使用 CouchDB 时理解这一点很重要。您可以在这里阅读所有相关信息:

http://docs.couchdb.org/en/stable/ddocs/views/collation.html

【讨论】:

以上是关于CouchDB、all_docs 和使用 endkey 过滤设计文档的主要内容,如果未能解决你的问题,请参考以下文章

CouchDB 添加没有预定义管理员的用户

使用 couchdb 和 lucene 自动完成

Hyperledger Fabric CouchDB as the State Database——使用CouchDB

无法使用管理员和自签名 SSL 证书复制 CouchDB 数据库

用户角色的 Couchdb/Couchdb 复制策略

CouchDB-Python:如何使用“_show”和“_list”函数?