CouchDB中的reduce函数参数中有什么?

CouchDB中的reduce函数参数中有什么?,couchdb,mapreduce,Couchdb,Mapreduce,我知道reduce函数应该在某种程度上结合map函数的结果,但到底传递给reduce函数的是什么 function(keys, values){ // what's in keys? // what's in values? } 我试图在Futon临时视图生成器中探索这一点,但我得到的只是减少溢出错误。因此,我甚至无法打印键或值参数来试图理解它们的外观 谢谢你的帮助 编辑: 我的问题如下。我正在使用Futon的临时视图生成器 我有一组表示文本文件的文档(这是一个脚本,我想用它来简化文档

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

function(keys, values){
  // what's in keys?
  // what's in values?
}
我试图在Futon临时视图生成器中探索这一点,但我得到的只是减少溢出错误。因此,我甚至无法打印
参数来试图理解它们的外观

谢谢你的帮助

编辑:

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

我有一组表示文本文件的文档(这是一个脚本,我想用它来简化文档的翻译)

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

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

我想为每个文本文件获取出现在所述文件中的文本片段列表。

更新

关于JavaScript API更改的注意事项:在2008年5月20日星期二之前(Subversion修订版r658405),向映射索引发出一行的函数名为“map”。它现在已更改为“发射”

这就是为什么使用了
map
而不是
emit
它被重命名的原因。抱歉,我更正了我的代码,使其在CouchDB的最新版本中有效

编辑

我认为您需要的是一个在sql db语言中有很多关系或连接的数据库。下面是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]
这将为您提供一个表单列表

  • 文本文件
  • 正文第1部分
  • 文本分割2
旧答案

直接从

Reduce函数在order key、values和rereduce中传递三个参数

Reduce函数必须处理两种情况:

  • 当REREREDUCE为false时:

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

    • 密钥将为空
    • 值将是以前调用reduce函数返回的值数组 i、 e.
      reduce(空[intermediate1,intermediate2,intermediate3],真)
      Reduce函数应返回一个值,该值既适用于最终视图的value字段,也适用于传递给Reduce函数的values数组的成员

  • 更新

    关于JavaScript API更改的注意事项:在2008年5月20日星期二之前(Subversion修订版r658405),向映射索引发出一行的函数名为“map”。它现在已更改为“发射”

    这就是为什么使用了
    map
    而不是
    emit
    它被重命名的原因。抱歉,我更正了我的代码,使其在CouchDB的最新版本中有效

    编辑

    我认为您需要的是一个在sql db语言中有很多关系或连接的数据库。下面是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]
    
    这将为您提供一个表单列表

    • 文本文件
    • 正文第1部分
    • 文本分割2
    旧答案

    直接从

    Reduce函数在order key、values和rereduce中传递三个参数

    Reduce函数必须处理两种情况:

  • 当REREREDUCE为false时:

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

    • 密钥将为空
    • 值将是以前调用reduce函数返回的值数组 i、 e.
      reduce(空[intermediate1,intermediate2,intermediate3],真)
      Reduce函数应返回一个值,该值既适用于最终视图的value字段,也适用于传递给Reduce函数的values数组的成员

  • 谢谢,但我不知道怎么用它。我编辑了我的第一篇文章,详细介绍了我试图解决的问题。我已经设法得到了他们在文章中得到的结果,那就是(文件、文本片段)对夫妇的列表。但是我想要的是一个(文件,[text\u fragment1,text\u fragment2…])列表,其中每个文件只出现在一对文件中,另一对文件的坐标包含与该文件对应的所有文本片段。可能我遗漏了一些内容,因为在文章中他们调用了“map”而不是“emit”。我不知道这个“map”函数来自哪里,它的作用是什么。我想我要放弃了。当你完全回答了主题的原始问题时,我会检查你。谢谢,但我不知道如何使用它。我编辑了我的第一篇文章,详细介绍了我试图解决的问题。我已经设法得到了他们在文章中得到的结果,那就是(文件、文本片段)的列表