使用endkey的CouchDB,all_docs和过滤器设计文档

时间:2014-05-09 10:04:30

标签: filter couchdb design-documents

首先,这个问题 - 来自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 个答案:

答案 0 :(得分:5)

/_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