2011-08-20 50 views
1

我有一些文件,以「綠色」,「紅色」,「黃色」的「狀態」欄中。分組使用Map和Reduce

我敢肯定,這可以使用MapReduce的生產含三個鍵(每一個狀態),每包含所有與該密鑰文件的數組值的分組響應。但是,我正在努力如何使用re(reduce)函數。

地圖功能:

function(doc) { 
    emit(doc.status, doc); 
} 

Reduce函數:???

回答

2

一般來說,你不會用減少功能來獲取文檔列表。減少是爲了取得一個清單,並將其減少到一個單一的值。事實上,無論如何,減少值的大小有一個上限,並且使用整個文檔將觸發reduce_overflow錯誤。減少的例子有計數,總和,平均值等。堅持使用地圖查詢,您將按照status的值對數值進行整理和排序。

在另一方面,可能是不相關的說明,我也不會發出你的看法文檔。您可以只使用include_docs視圖查詢參數,並獲得相同的效果,同時節省流程中的磁盤空間。權衡是在內部,文檔必須逐一檢索。 (但因爲它們是由_id反正已經編入索引,它通常是一個微不足道的差異

+1

+1。 CouchDB喜歡高列表,而不是胖列表。如果您查詢'?reduce = false&key =「Green」',您已經*做*擁有一組「綠色」文檔。這將給你一個文件的數組(加上一些你可以忽略的數據,或者用_list函數刪除)。 – JasonSmith

+1

?include_docs =真正引入了競爭條件,其中文檔可以在沙發從磁盤讀取視圖行,當它返回到從磁盤中讀取文件的時間之間改變英寸文檔可以在短暫的時間內改變。但是我認爲絕大多數應用程序都有很多更大的事情需要擔心。 – JasonSmith

5

這不是降低是爲了解決一個問題;減少的CouchDB是聚集

如果我理解正確,你想這一點;

地圖:

function(doc) { 
    for (var i in doc.status) { 
    emit(doc.status[i], null); 
    } 
} 

然後你可以找到狀態綠色的所有文檔用;

/_design/foo/_view/bar?key="Green"&include_docs=true 

這將返回該狀態的所有文檔的列表。如果您希望在單個查詢中查找多個狀態的文檔,請使用帶有此表單主體的http POST;

{"keys":["Green", "Red"]} 

HTH, B.