【问题标题】:Group documents by _id but allow for searching by other values按 _id 对文档进行分组,但允许按其他值进行搜索
【发布时间】:2014-09-18 21:31:31
【问题描述】:

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

{
  _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 中的哪个位置。这似乎也很复杂,因为我认为应该很简单。

查询视图时如何阻止重复出现?

【问题讨论】:

    标签: node.js couchdb couchapp


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-20
      • 2021-05-05
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多