1

我知道 reduce 函数应该在某种程度上结合 map 函数的结果,但究竟传递给 reduce 函数的是什么?

function(keys, values){
  // what's in keys?
  // what's in values?
}

我试图在 Futon 临时视图构建器中探索这一点,但我得到的只是reduce_overflow_errors。所以我什至不能打印keysorvalues参数来试图理解它们的样子。

谢谢你的帮助。

编辑:

我的问题如下。我正在使用蒲团的临时视图生成器。

我有一组表示文本文件的文档(它用于我想用来简化文档翻译的脚本)。

text_file:
    id   // the id of the text file is its path on the file system

我还有一些文档代表出现在上述文件中的文本片段,以及它们在每个文件中的位置。

text_fragment:
    id
    file_id   // correspond to a text_file document 
    position

我想为每个 text_file 获取该文件中出现的文本片段的列表。

4

1 回答 1

4

更新

关于 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 函数必须处理两种情况:

  1. 当 rereduce 为 false 时:

    • key 将是一个数组,其元素是 [key,id] 形式的数组,其中 key 是 map 函数发出的 key,id 是生成 key 的文档的 key。
    • values 将是为键中的各个元素发出的值的数组,即reduce([ [key1,id1], [key2,id2], [key3,id3] ], [value1,value2,value3], false)
  2. 当 rereduce 为真时:

    • 键将为空
    • values 将是先前调用reduce 函数返回的值数组,即reduce(null, [intermediate1,intermediate2,intermediate3], true) Reduce 函数应返回单个值,既适用于最终视图的value 字段,也适用于传递给reduce 函数的values 数组的成员。
于 2012-07-31T15:27:14.793 回答