【发布时间】:2011-08-21 01:38:11
【问题描述】:
我有一些“状态”字段为“绿色”、“红色”、“琥珀色”的文档。
我确信可以使用 MapReduce 生成包含三个键(每个状态一个键)的分组响应,每个键的值包含具有该键的所有文档的数组。但是,我正在为如何使用 re(reduce) 函数而苦苦挣扎。
地图功能:
function(doc) {
emit(doc.status, doc);
}
减少功能:???
【问题讨论】:
我有一些“状态”字段为“绿色”、“红色”、“琥珀色”的文档。
我确信可以使用 MapReduce 生成包含三个键(每个状态一个键)的分组响应,每个键的值包含具有该键的所有文档的数组。但是,我正在为如何使用 re(reduce) 函数而苦苦挣扎。
地图功能:
function(doc) {
emit(doc.status, doc);
}
减少功能:???
【问题讨论】:
这不是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.
【讨论】:
一般来说,您不会使用reduce 函数来获取您的文档列表。减少意味着获取一个列表,并将其减少为单个值。事实上,reduce 值的大小是有上限的,使用整个文档会触发reduce_overflow 错误。 reduce 的示例包括计数、总和、平均值等。坚持使用 map 查询,您的值将按 status 值进行整理和排序。
在另一个可能不相关的注释中,我不会使用您的视图发出文档。您可以只使用include_docs 查看查询参数,并达到相同的效果,同时在此过程中节省磁盘空间。权衡是在内部必须一个接一个地检索文档。 (但由于它们已经被_id 索引,因此通常可以忽略不计。
【讨论】:
?reduce=false&key="Green",您已经确实拥有一组“绿色”文档。这将为您提供一个文档数组(以及一些您可以忽略或使用 _list 函数删除的其他数据)。