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

  • 本文关键字:couchdb 过滤 文档 map 函数 couchdb
  • 更新时间 :
  • 英文 :


情况
我有一组名为"触摸"的文档,指向多对一关系中名为"消费者"的一组文档

_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

实际上,我试图只为ted"接触"过的消费者加载消费者信息,所以我的查询看起来像这个

 get_touches?agent=ted&include_docs=true

问题
问题是,我不想多次显示相同的消费者信息。因此,受这个So答案的启发,用CouchDB视图替换SQL中的多个联接,我编写了以下映射函数来过滤结果。

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

并且它只返回一个空集。我不确定我做错了什么,甚至不确定这是否真的有效。

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

AFAIK在映射函数中,您不能同时访问多个文档。将数据推入map函数之外的数组的示例不会跨文档存储数据。

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

另一种选择是按用户存储数据,即使用作为消费者的密钥更新文档,然后添加到存储所有触摸的列表中。显然,如果你想通过代理访问数据,这是有缺点的。

最新更新