2012-07-31 101 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