CouchDB _changes-API 过滤器
Posted
技术标签:
【中文标题】CouchDB _changes-API 过滤器【英文标题】:CouchDB _changes-API filter 【发布时间】:2018-02-05 16:07:37 【问题描述】:我正在尝试让 CouchDB 2.1.1 上的过滤 _changes-API 流正常工作,但我遇到了问题。 我只想通过包含字段“type”和值为“article”的更改提要接收文档。
根据documentation,这样的东西应该可以工作:
function (doc, req)
if (doc.type && doc.type == 'article')
return true;
return false;
我在名为filters
的_design 文档中使用Fauxton 在名为type_article
的新视图中创建了上述函数。当我点击视图时,我看不到任何结果。
现在我想使用过滤器作为 GET 参数从数据库中检索过滤后的更改提要:
localhost:5984/my_database/_changes?filter=filters/type_article
CouchDB 的响应是
"error":"not_found","reason":"missing json key: filters"
您知道如何让过滤器功能发挥作用吗?
PS:我也尝试使用'emit()'函数而不是返回true
和false
,这返回了预期的结果,但是在尝试查询_changes
时出现了同样的错误。
【问题讨论】:
【参考方案1】:请注意,您实际上可以将视图用作_changes
的过滤器。在这种情况下,如果 map 函数为其发出至少一条记录,则文档计数通过。
例如,如果设计文档(称为“ddoc”)如下所示:
"views":
"type_article":
"map":
"function(doc)
if (doc.type && doc.type == 'article')
emit(doc.name);
"
然后查询看起来像localhost:5984/my_database/_changes?filter=_view&view=ddoc/type_article
。注意属性filter
缺少_design
前缀和关键字_view
。这是相应文档部分的链接:[link]
这里唯一需要注意的是,这个过滤器实际上并没有使用构建视图索引,因此并不比普通的过滤器函数快。
【讨论】:
非常有趣!感谢分享!【参考方案2】:我发现了问题。当您在 Fauxton 中使用 Design Documents
菜单项旁边的小 + 号创建视图时,您只能创建视图。视图不同于过滤器。
要创建适用于 _changes 提要的过滤器,请单击“创建文档”并创建如下文档:
"_id": "_design/filters",
"filters":
"type_article": "function (doc, req) \n if (doc.type && doc.type == \"article\") \n return true;\n else \n return false; \n\n"
这将创建一个名为filters
的新设计文档,其函数为type_article
。
【讨论】:
以上是关于CouchDB _changes-API 过滤器的主要内容,如果未能解决你的问题,请参考以下文章
CouchDB、all_docs 和使用 endkey 过滤设计文档