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()'函数而不是返回truefalse,这返回了预期的结果,但是在尝试查询_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 视图不适用于多个过滤器

CouchDB:视图中的过滤函数

CouchDb - 防止 couchDb 提供视图

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

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

CouchDB:在 CouchApp 中通过 http 请求获取服务器时间