更新
关于 JavaScript API 更改的注意事项:在 2008 年 5 月 20 日星期二(Subversion 修订版 r658405)之前,向地图索引发出一行的函数被命名为“map”。它现在已更改为“发射”。
这就是为什么map
使用而不是emit
重命名的原因。抱歉,我更正了我的代码,使其在最新版本的 CouchDB 中有效。
编辑
我认为您正在寻找的是 sql db 语言中的 has-many 关系或连接。这是Christopher Lenz 的一篇博客文章,准确描述了 CouchDB 中这种场景的选择。
在最后一部分中,描述了一种可用于所需列表的技术。您需要以下格式的地图功能
function(doc) {
if (doc.type == "text_file") {
emit([doc._id, 0], doc);
} else if (doc.type == "text_fragment") {
emit([doc.file_id, 1], doc);
}
}
现在您可以通过以下方式查询视图:
my_view?startkey=["text_file_id"]&endkey;=["text_file_id", 2]
这为您提供了表单列表
- 文本文件
- text_fragment_1
- text_fragment_2
- ..
旧答案
直接来自CouchDB Wiki
function (key, values, rereduce) {
return sum(values);
}
Reduce 函数按 key、values 和 rereduce 的顺序传递三个参数
Reduce 函数必须处理两种情况:
当 rereduce 为 false 时:
- key 将是一个数组,其元素是 [key,id] 形式的数组,其中 key 是 map 函数发出的 key,id 是生成 key 的文档的 key。
- values 将是为键中的各个元素发出的值的数组,即
reduce([ [key1,id1], [key2,id2], [key3,id3] ], [value1,value2,value3], false)
当 rereduce 为真时:
- 键将为空
- values 将是先前调用reduce 函数返回的值数组,即
reduce(null, [intermediate1,intermediate2,intermediate3], true)
Reduce 函数应返回单个值,既适用于最终视图的value 字段,也适用于传递给reduce 函数的values 数组的成员。