按_id分组文档,但允许按其他值搜索

时间:2014-09-18 21:31:31

标签: node.js couchdb couchapp

我有文档和视图,您可以在其中按关键字列表进行搜索。文档可能如下所示:

{
  _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,这也不好。

我也读过有关使用列表功能的内容,但我不确定 list 函数应该放在couchapp中的哪个位置。对于我认为应该相当简单的事情,这似乎也很复杂。

如何在查询视图时停止重复操作?

1 个答案:

答案 0 :(得分:0)

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

在reduce函数中,您有多个值(即具有相同键的文档数组)。因此,如果您重写下面的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();
}

在您希望索引项引用包含该键的文档的任何情况下,都不能使用reduce函数。