【问题标题】:Grouping using Map and Reduce使用 Map 和 Reduce 进行分组
【发布时间】:2011-08-21 01:38:11
【问题描述】:

我有一些“状态”字段为“绿色”、“红色”、“琥珀色”的文档。

我确信可以使用 MapReduce 生成包含三个键(每个状态一个键)的分组响应,每个键的值包含具有该键的所有文档的数组。但是,我正在为如何使用 re(reduce) 函数而苦苦挣扎。

地图功能:

function(doc) {
  emit(doc.status, doc);
}

减少功能:???

【问题讨论】:

    标签: couchdb mapreduce


    【解决方案1】:

    这不是reduce想要解决的问题; CouchDB 中的 reduce 用于聚合。

    如果我理解正确,你想要这个;

    地图:

    function(doc) {
      for (var i in doc.status) {
        emit(doc.status[i], null);
      }
    }
    

    然后您可以找到所有状态为 Green 的文档;

    /_design/foo/_view/bar?key="Green"&include_docs=true
    

    这将返回具有该状态的所有文档的列表。如果您希望在单个查询中查找多个状态的文档,请使用带有此表单正文的 http POST;

    {"keys":["Green", "Red"]}
    

    HTH, B.

    【讨论】:

      【解决方案2】:

      一般来说,您不会使用reduce 函数来获取您的文档列表。减少意味着获取一个列表,并将其减少为单个值。事实上,reduce 值的大小是有上限的,使用整个文档会触发reduce_overflow 错误。 reduce 的示例包括计数、总和、平均值等。坚持使用 map 查询,您的值将按 status 值进行整理和排序。

      在另一个可能不相关的注释中,我不会使用您的视图发出文档。您可以只使用include_docs 查看查询参数,并达到相同的效果,同时在此过程中节省磁盘空间。权衡是在内部必须一个接一个地检索文档。 (但由于它们已经被_id 索引,因此通常可以忽略不计。

      【讨论】:

      • +1。 CouchDB 喜欢高列表,而不是胖列表。如果您查询?reduce=false&key="Green",您已经确实拥有一组“绿色”文档。这将为您提供一个文档数组(以及一些您可以忽略或使用 _list 函数删除的其他数据)。
      • ?include_docs=true 引入了一种竞争条件,其中文档可以在 Couch 从磁盘读取视图行到返回从磁盘读取文档之间发生变化。文档可以在那短暂的时间内改变。但我认为绝大多数应用程序都有更大的事情需要担心。
      猜你喜欢
      • 1970-01-01
      • 2019-01-21
      • 2019-12-20
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多