我有一些文件的“状态”字段为“绿色”,“红色”,“琥珀色”。
我确信可以使用MapReduce来生成包含三个键(每个状态一个)的分组响应,每个键的值包含具有该键的所有文档的数组。但是,我正在努力研究如何使用re(reduce)函数。
地图功能:
function(doc) {
emit(doc.status, doc);
}
减少功能:???
答案 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
编入索引,所以它通常可以忽略不计。