CouchDB _changes-API 过滤器

CouchDB _changes-API filter

我正在尝试使 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出现同样的错误。

我发现了问题。当您使用 Design Documents 菜单项旁边的小 + 号在 Fauxton 中创建视图时,您只能创建视图。视图不同于过滤器。 要创建适用于 _changes 提要的过滤器,请单击 'Create Document' 并创建如下文档:

{
  "_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

请注意,您实际上可以将视图用作 _changes 的过滤器。在这种情况下,如果地图函数至少为它发出一条记录,则文档计数通过。

例如,如果设计文档(称为 "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。请注意缺少 _design 前缀和属性 filter 的关键字 _view。这是相应文档部分的 link:[link]

这里唯一要注意的是这个过滤器实际上并没有使用内置的视图索引,因此并不比普通的过滤器函数快。