我有一个Angular2提供程序服务,它使用PouchDB在后端调用Cloudant。
在cloudant中,我有两种类型的文档,用户和组。
USER
====
{
"_id": "c8835bc37ab524746db1f53dde5f42ba",
"_rev": "2-981a4194c1b0f10eec5500f908cab108",
"type": "follower",
"user": "<<unique name>>",
"group": "3cf87867c6d8d980679e2e5a320c28c9",
"status": "accepted"
}
GROUP
=====
{
"_id": "3cf87867c6d8d980679e2e5a320c28c9",
"_rev": "2-b8a1716d9bdc86adf644c8e1915d2a6e",
"name": "<<Group Name>>",
"type": "group"
}
我已经在cloudant中编写了一个视图,如下所示
function (doc) {
if (doc.type === "follower" || doc.type === "admin") {
emit(doc.user, {"_id": doc.group, "type": doc.type, "status": doc.status});
}
}
当我使用key =&#34; user&#34; db.query时,该视图可以帮助我获取组文档。和include_docs = true。(因为我提供的_id不是用户而是该组的。
在添加db.changes代码之前,一切都很好。我使用了与上面相同的过滤器,视图和关键选项,但这似乎总是返回用户文档,而不是组。
this.db.changes({
live: true,
since: 'now',
include_docs: true,
attachments: true,
filter: '_view',
view: 'Users/userGroups',
key: <<user>>
我在更改电话中做错了吗?
答案 0 :(得分:0)
我不相信CouchDB / Cloudant支持您尝试做的事情有几个原因:
key
。文档还说明了使用_view
作为过滤器类型:此外,您无法使此类过滤器动态化,例如处理 请求查询参数或处理用户上下文对象 - 地图 函数仅与文档一起使用。
特殊过滤器_view允许使用现有的地图功能 过滤。如果map函数为处理的文档发出任何内容 它被视为已接受,并且更改事件将发送到Feed。对于 大多数使用 - 练习案例过滤功能与地图功能非常相似, 所以这个功能有助于减少重复代码的数量。
因此,include_docs
仅包含已更改的文档 - 而不是作为视图的一部分发出的值。
我认为您将不得不返回数据库以在用户更改后检索组,或者您可以执行诸如将所有组存储在内存中(不确定是否可行)之类的操作,并监视更改组以使您的内存组保持最新(使用新视图等)。
CouchDB文档: http://docs.couchdb.org/en/2.0.0/api/database/changes.html#changes-filter-view