2012-08-15 77 views
0

目前,我的代碼看起來像在CouchDB中,如何在reduce函數中發出鍵值?

function(keys, values, rereduce){ 
    return {"key":keys[0][0],"count":values.length}; 
} 

在運行此,結果行是:

key = None, value={u'count':3,u'key':u'123456'} 

這工作對我而言,正如我剛纔分析的價值屬性的JSON字符串,但這似乎是做錯事情的錯誤方式。

那麼我怎麼能讓reduce函數發出一個關鍵值而不是None?

回答

0

沒有足夠的上下文可以肯定,但是您可能會考慮減少功能,然後再考慮它們的打算方式。 From the CouchDB guide

如果不降低值一個標量值或小的固定大小的物體或數組有固定數量的小尺寸的標量值,你可能做錯了。

你的例子確實減少到小的東西,但看起來像是巧合。如果你想輸出某種鍵,你可能需要一個map函數。或者,重新思考你在做什麼以及它如何適應MapReduce模型。

0

我想清楚發生了什麼事。 reduce函數創建了一個單一的標量值,而我想要的是一個鍵值對的列表。發生這種情況是因爲我沒有使用grouping

通過添加「基團=真」參數我的查詢,使用_count作爲我的減少現在生產

key = 123456, value=3 

沒有分組意味着所有數據減少到一個單一的,標量值。通過啓用分組,事物只能通過具有相同鍵值的項目來減少,這正是我想要的。

+0

正如MarcinSkórzewski所指出的那樣,您的降低將會隨機失敗,因爲您不檢查rereduce的值。 – 2012-08-17 17:30:10

+0

我也注意到了。我重新編寫了函數以適應重新減少,但是在找到group = true參數後,我現在只使用_count,而不是任何自定義reduce函數。 – samoz 2012-08-17 17:36:04

+0

太好了。內置的減少功能幾乎總是最好的選擇。例如,即使我只需要像'max'這樣的單個值,我也會使用'_stats'。 – 2012-08-17 17:43:34

1

我認爲你的代碼只適用於第一次減少。它無法進行rereduce。閱讀Introduction to CouchDB Views: 1.2.2 Reduce Functions。當第三個參數(rereduce)爲true時,請注意reduce()聲明的第一個參數(key)。

我也是這樣的,你的count不會像你期望的那樣工作rereduce==true。它應該總結早期降低的計數,不計算計數

相關問題