CouchDB, all_docs和过滤器设计文档与endkey



首先,这个问题——来自all_docs的过滤器设计文档——似乎已经像下面描述的那样解决了:https://plus.google.com/+ JasonDeRose/文章/1 ip5tu3wvqw

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

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

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

这是一个bug, endkey=%22_%22不再工作,是否有一个更方便,仍然工作的方式?

/_all_docs是CouchDB的特殊情况。它不使用普通的Unicode排序规则,而是使用ASCII排序规则。

ASCII顺序中的'_'字符出现在大写字母和小写字母之间。所以如果你的文档id以小写字母开头(默认行为),它们将在任何设计文档之后显示。如果你的文档以大写字母开头,它们会在设计文档之前出现。

试着创建一个id为:"ABC"的文档,你会看到它出现在设计文档之前,你过滤设计文档的技巧在这种情况下会起作用。

但是,我建议您完全停止使用' _all_docs视图。而是使用普通的视图功能。当您创建视图时,CouchDB会自动跳过设计文档。如果你的视图是这样的

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

你可以在没有开始或结束键的情况下查询这个,并获得所有没有设计文档的文档。

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

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

最新更新