2012-07-31 66 views
1

据我了解,减少功能应该有所结合地图功能的结果,但究竟传递给reduce函数?什么是CouchDB中的减少函数的参数?

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

我试图在被褥临时视图生成器来探索这一点,但我的一切都是reduce_overflow_errors。所以,我甚至不能打印keysvalues论点,试图了解他们的样子。

感谢您的帮助。

编辑:

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

我有一组表示文档的文本文件(它是一个脚本,我想用来做文件翻译更容易)。

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

更新

于JavaScript API的变化注:在星期二,2008年5月20日(Subversion修订r658405)功能发出一行到地图索引,被命名为 “地图”。它现在已经变成“发射”了。

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

编辑

我知道你在寻找的是一个具有一对多的关系或在SQL数据库语言加入。这里是一个blog文章由克里斯托弗·伦茨描述正是你的选择是对这种场景在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_file列表
  • text_fragement_1
  • text_fragement_2
  • ..

老回答

CouchDB Wiki

function (key, values, rereduce) { 
    return sum(values); 
} 

Reduce函数

直接在命令键,值传递三个参数和rereduce

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

  1. 当rereduce为假:

    • 键将是一个数组,其元素是形式为[键,ID],其中关键的是阵列由地图功能和id发射的关键是,密钥生成的文档。
    • 值将是在键 用于各个元件发出的值的阵列,即reduce([ [key1,id1], [key2,id2], [key3,id3] ], [value1,value2,value3], false)
  2. 当rereduce为真:

    • 关键将是空
    • 值将是先前调用reduce函数返回的值的数组 即reduce(null, [intermediate1,intermediate2,intermediate3], true) 减少函数应该返回单个值,适用于最终视图的value字段以及作为传递给reduce函数的values数组的成员。
+0

谢谢,但我不明白如何使用它。我编辑了我的第一篇文章,详细介绍了我正在尝试解决的问题。 – 2012-07-31 16:02:55

+0

我已经设法得到他们在文章中得到的结果,即(file,text_fragment)夫妇的列表。但我想要的是一个(文件,[text_fragment1,text_fragment2 ...])列表,其中每个文件只出现在一对中,另一个坐标包含与该文件相对应的所有文本片段。 – 2012-07-31 17:16:24

+0

也许我错过了一些东西,因为在文章中他们打电话给“地图”而不是“发射”。我不知道这个“地图”功能来自哪里以及它做了什么。我想我会放弃。当你完全回答了题目的原始问题时,我会检查你的绿色。 – 2012-08-01 09:51:36