Node.js 按_id对文档进行分组,但允许按其他值进行搜索

Node.js 按_id对文档进行分组,但允许按其他值进行搜索,node.js,couchdb,couchapp,Node.js,Couchdb,Couchapp,我有文档和视图,您可以在其中通过关键字列表进行搜索。文档可能看起来像: { _id: "foo", keywords: ["bar", "baz"], } 那么,我的看法是: map: function (doc) { doc.keywords.forEach(function(word) { emit(word, doc);

我有文档和视图,您可以在其中通过关键字列表进行搜索。文档可能看起来像:

{
  _id: "foo",
  keywords: ["bar", "baz"],
}
那么,我的看法是:

map: function (doc) {
  doc.keywords.forEach(function(word) {                                  
    emit(word, doc);                                            
  });
}
这很好,因为我得到了foo文档,但问题是如果我不提供一个键,我会得到这个文档两次,这很有意义,因为它有两个关键字。但是,我只需要/想要该文档一次

我还补充说

reduce: function (key, value, rereduce) {                               
  return value;                                                   
}
但这让我减少了溢出错误。如果我使用returnnull,那么我为文档获取的值是null,这也不好

我也读过关于使用列表函数的内容,但我不确定列表函数在couchapp中应该放在哪里。这似乎也相当复杂,因为我认为这应该是相当简单的


在查询视图时,如何阻止重复项的出现?

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

在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函数