2014-09-18 117 views
1

我有文档和视图,您可以通过关键字列表进行搜索。文档可能看起来像:按_id分组文档,但允许按其他值搜索

{ 
    _id: "foo", 
    keywords: ["bar", "baz"], 
} 

然后,我的观点:

map: function (doc) { 
    doc.keywords.forEach(function(word) {         
    emit(word, doc);            
    }); 
} 

这在伟大工程,我得到的foo文件回来,但问题是,如果我不提供关键我得到这个文件两次是有道理的,因为它有两个关键字。但是,我只需要/需要一次文档。

我还添加

reduce: function (key, value, rereduce) {        
    return value;             
} 

,但是这给了我reduce_overflow_error。如果我使用return null,那么我为文档获得的值是null,这也是不好的。

我也读过关于使用列表函数,但我不知道列表函数应该在couchapp去。这似乎也相当复杂,我觉得应该相当简单。

如何在查询视图时阻止重复进来?

回答

0

我发现你的查询令人困惑,但让我帮你解决一个错误。

在reduce函数中,您有多个值(即具有相同键的文档数组)。因此,如果您按照以下方式重新编写缩减函数,则会得到每个关键字只有一个文档的关键字索引,但是缩小的文档不会再链接到原始文档。

function (key, values, rereduce){ 
    return values[0]; 
} 

如果你的使用情况是让每个关键词的文档计数,你会写:

function (key, values, rereduce){ 
    if (rereduce){ 
     var sum = 0; 
     for (i=0; i< values.length(); i++){ 
      sum = sum + values[i]; 
     } 
     return sum; 
    } 
    return values.length(); 
} 

在你想要的索引项指您对文档进行任何情况下,包含关键,你不能使用减少功能。