如何从map函数本身中过滤couchdb中的重复文档

时间:2014-10-09 03:42:21

标签: couchdb

状况
我有一套名为" touches"这指向一组称为"消费者"在多对一的关系中

_id     : 0
type    : touch
consumer: 1 //three touches pointing to one consumer
agent   : bill

_id     : 1
type    : touch
consumer: 1 //three touches pointing to one consumer
agent   : ted

_id     : 2
type    : touch
consumer: 1 //three touches pointing to one consumer
agent   : ted

我实际上只是尝试为消费者加载消费者信息,而这些消费者已经触及了#34;所以我的查询看起来像这样

 get_touches?agent=ted&include_docs=true

问题
问题是我不想多次展示相同的消费者信息。所以,受到这个SO答案Replace multiple joins in SQL with CouchDB views的启发,我编写了以下地图函数来过滤结果。

"map": "var ids = []; 
        function(doc){
            if(doc.type === \"touch\" && !ids.contains(doc.consumer)){         
               ids.push(doc.consumer); 
               emit(doc._id, {\"_id\": doc.consumer});
            }
        }"

它只返回一个空集。我不确定我做错了什么,即使这确实有效。

更多信息
许多代理商可以多次触摸单个消费者,因此存储触摸代理或触摸消费者文档并不是一个好的答案。

1 个答案:

答案 0 :(得分:1)

AFAIK您无法在地图功能中同时访问多个文档。将数据推送到map函数之外的数组中的示例不会在文档之间存储数据。

这将是一个简单的reduce函数,尽管它仅为任何给定的键获取第一个文档。

替代方案 - 可以是用户存储数据,即。使用作为消费者的密钥更新文档,只添加到存储所有触摸的列表。显然,如果你想通过例如访问数据,这有缺点。中介。