【问题标题】:CouchDB View equivalent of SUM & GROUP BYCouchDB 查看相当于 SUM 和 GROUP BY
【发布时间】:2011-04-01 20:56:21
【问题描述】:

我有多个 CouchDB 文档表示带有属性 userId 和标签的时间戳(用户可以有 n 个时间戳并为每个时间戳分配一个标签)。我想通过特定的 userId 查询 CouchDB 并获取用户使用过的标签的排序列表(按出现排序)。

视图会是什么样子?

如果我想获得按出现次数排序的所有标签的列表(无论来自哪个用户),或者如果我假设只有具有相同 userId 的文档,我会这样:

地图:

function(doc) {
  if(doc.tag) emit(doc.tag, 1); 
}

减少:

function(keys, values) {
  return sum(values);
}

但是如何对结果进行分组,以便我可以按特定的 userId 过滤查询?

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    回答我自己的问题。

    似乎 CouchDB 支持数组作为键。考虑到这一点,这很简单:

    地图:

    function(doc) {
      if(doc.tag) emit([doc.userId, doc.tag], 1); 
    }
    

    减少:

    function(keys, values) {
      return sum(values);
    }
    

    然后根据 userId & tag 对结果进行排序。

    【讨论】:

    • 再补充一点,您可以使用group_level 视图参数来实现不同级别的粒度以进行reduce 计算。如果您使用日期作为键的数组,这可能是最好的证明。 [year, month, day]。在这种情况下,group_level=1 将为您提供全年的汇总数据,group_level=2 将按月计算,group_level=3 将按天计算。
    • 另外一件事,如果你只使用_sum 作为你的reduce 函数,CouchDB 将自动使用一个预先编写的Erlang 函数,它的执行速度比JavaScript 等效函数快得多。 (其他例子都记录在here
    • 不过,这不会按出现次数排序。
    • 我们如何根据sum(values) 而不是键来排序结果?类似于 SQL 中的 ORDER BY COUNT(*) DESC
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多