2016-10-25 73 views
0

我有一个使用PouchDB在后端调用Cloudant的Angular2提供者服务。PouchDB查询和相同视图上的更改返回不同结果

在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}); 
    } 
} 

的观点可以帮我获得专家组的文件,当我用钥匙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

我不相信的CouchDB/Cloudant支持你正在尝试了几个理由这样做:

  1. 没有了变化端点支持key CouchDB的文件中没有提及。该文档还指出本作使用_view作为过滤器类型:

而且,你不能让这种滤波器例如动态处理 请求查询参数或处理用户上下文对象 - 地图 函数仅与文档一起运行。

  • CouchDB的是一个文件只是否是由视图发射,看它是否应该包括在变化的测试。它似乎没有处理时发出的实际内容:
  • 特殊的过滤器_view允许使用现有的地图功能作为 过滤器。如果地图功能为处理的文档发出任何内容,则它会被视为已接受,并且更改事件会发送到Feed。对于 ,大多数使用实践案例的过滤功能与映射功能非常相似,因此该功能有助于减少重复代码的数量。

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

    我想你将不得不返回到数据库来检索用户更改后的组,或者你可以做一些事情,比如将所有组存储在内存中(不确定是否可行),并监视变化这些组保持您的内存组更新(使用新的视图等)。

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

    相关问题