2014-06-28 105 views
1

我在CouchDB中有一個示例數據庫,其中包含多個飛機的信息,以及一個顯示製造商爲關鍵字和模型作爲值的視圖。CouchDB減少錯誤?

地圖功能是

function(doc) { 
    emit(doc["Manufacturer"], doc._id) 
} 

和減少功能

function(keys, values, rereduce){ 
    return values.length; 
} 

這是非常簡單的。我確實得到正確的結果,當我用被褥,在那裏我有26架飛機波音的顯示視圖:

​​

但是,如果使用REST客戶端查詢使用

http://localhost:6060/aircrafts/_design/basic/_view/VendorProducts?key="BOEING" 

我的看法得到

{"rows":[ 
    {"key":null,"value":2} 
]} 

我測試了不同的客戶端(包括Web瀏覽器,REST客戶端擴展和捲曲),所有給我的價值2!而使用其他鍵的查詢正常工作。

MapReduce函數或查詢有問題嗎?

回答

1

問題可能是因爲分組

使用組= true(此蒲團默認的),你會得到一個單獨的在地圖中的每個唯一鍵減少值的 - 那就是,所有的值該共享相同的密鑰分組在一起並減少爲單個值。

在查詢curl等時,您是否通過group=true作爲查詢參數?由於它在默認情況蒲團通過你看到的結果一樣

BOEING:26

凡爲無group=true正在返回只降低的價值。

因此,嘗試此查詢

http://localhost:6060/aircrafts/_design/basic/_view/VendorProducts?key="BOEING"&group=true

+0

謝謝!這確實是我需要的。我對CouchDB相當陌生,有些事情我沒有注意。而使用'group = true'也解決了'null'鍵的問題,在這種情況下,雖然值是正確的,但鍵總是'null'。但是現在我想知道,爲什麼我們需要'group'和'reduce'兩個參數?在這種情況下只有'reduce'有用? –

+0

區別在於,對於每組唯一鍵,「group」和「group_level」運行減少,其中reduce將結果減少爲單個值。所以如果你有另一個像'ACME'的製造商,上面的查詢將返回一個結果'BOEING:26,ACME:1',其中reduce將返回'27'。因此,像運行多個分組一樣減少鍵。 [更多關於wiki](http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Grouping)。順便說一句,我希望你享受couchdb :) –

+0

再次感謝!我嘗試了使用和不使用「組」的東西,我現在認爲我對它有更多的瞭解。但是,當密鑰包含「BOEING」和「group = false」時,我仍然得到一個奇怪的結果,它總是2,而其他結果是正確的。當'group = true'時,結果也是正確的。也許我的文檔有問題?順便說一下,我使用的是CouchDB 1.5,它可能是一個已經在1.6中修復的bug嗎? (由於一些未知的原因,我沒有成功地讓我的Windows 7工作1.6)。我喜歡CouchDB,我想深入其中! –

1

你似乎陷入了re-reduce -trap。 Couchdb嚴格地說使用了一個map-reduce-rereduce進程。

  • 地圖:以輸出格式重新格式化您的數據。
  • Reduce:聚合幾個(但不是所有條目具有相同的密鑰)的數據 - 在你的情況下正確工作。
  • 重新減少:與減少相同,但與之前減少的數據相同。

當您更改reduce階段中的值的格式時,re-reduce調用將聚合已減少的值的數量。

解決方案:

  1. 您可以在地圖中值正好被設置爲1,降低值的總和。
  2. 您檢查rereduce==true,並在這種情況下返回值的總和 - 這將是初始reduce返回的整數值。
+0

謝謝!我試過你提到的,雖然我100%同意你的看法,但結果幾乎一樣。如果我使用您的解決方案,無論使用「羣組」還是不使用26架波音飛機,但所有其他飛機都是相同的!也就是說,無論我使用「group」還是不使用,我都能獲得相同數量的飛機。這很奇怪!但是,我再次同意你的解決方案,我會保持這種想法! –