PouchDB查询和对同一视图的更改会返回不同的结果

时间:2016-10-25 11:42:15

标签: pouchdb cloudant

我有一个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>>

我在更改电话中做错了吗?

1 个答案:

答案 0 :(得分:0)

我不相信CouchDB / Cloudant支持您尝试做的事情有几个原因:

  1. CouchDB文档中没有提及更改端点支持key。文档还说明了使用_view作为过滤器类型:
  2.   

    此外,您无法使此类过滤器动态化,例如处理   请求查询参数或处理用户上下文对象 - 地图   函数仅与文档一起使用。

    1. CouchDB仅测试视图是否发出文档以查看是否应将其包含在更改中。它似乎不处理发出的实际内容:
    2.   

      特殊过滤器_view允许使用现有的地图功能   过滤。如果map函数为处理的文档发出任何内容   它被视为已接受,并且更改事件将发送到Feed。对于   大多数使用 - 练习案例过滤功能与地图功能非常相似,   所以这个功能有助于减少重复代码的数量。

      因此,include_docs仅包含已更改的文档 - 而不是作为视图的一部分发出的值。

      我认为您将不得不返回数据库以在用户更改后检索组,或者您可以执行诸如将所有组存储在内存中(不确定是否可行)之类的操作,并监视更改组以使您的内存组保持最新(使用新视图等)。

      CouchDB文档: http://docs.couchdb.org/en/2.0.0/api/database/changes.html#changes-filter-view