使用Map和Reduce进行分组

时间:2011-08-20 15:59:54

标签: couchdb mapreduce

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

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

地图功能:

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

减少功能:???

2 个答案:

答案 0 :(得分:5)

这不是一个旨在解决的问题; CouchDB中的reduce用于聚合。

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

地图:

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

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

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

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

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

HTH, 乙

答案 1 :(得分:2)

一般来说,您不会使用reduce函数来获取文档列表。 reduce表示获取列表,并将其减少为单个值。实际上,无论如何,reduce值的大小都有一个上限,使用整个文档会触发reduce_overflow错误。减少的示例包括计数,总和,平均值等。坚持使用地图查询,您将按照status值对您的值进行整理和排序。

在另一个可能不相关的注释中,我不会随你的观点发出文件。您可以使用include_docs视图查询参数,并实现相同的效果,同时在进程中节省磁盘空间。权衡是内部文档必须逐个检索。 (但是因为它们已被_id编入索引,所以它通常可以忽略不计。