2013-07-27 116 views
2

我試圖找出地圖功能,減少功能爲以下情況:CouchDB的地圖功能,減少功能

文件:

{ 
"_id" : "1_A", 
"key1": 10, 
"key2": 10 
} 

{ 
"_id" : "2_A", 
"key1": 2, 
"key2": 3 
} 
{ 
"_id" : "1_B", 
"key1": 20, 
"key2": 20 
} 

{ 
"_id" : "2_B", 
"key1": 1, 
"key2": 0 
} 

期待有:在所有id文檔中的每個鍵(key1,key2 ... keyn)的和分別以「_A」,「_B」...「_Z」結尾。

在這種情況下,期望具有sumA:「key1」:12,「key2」:13。和sumB:「key1」:21,「key2」:20;

我一直在研究地圖功能(doc),在我看來,它只處理一次指定爲「doc」值的文檔。

有沒有辦法達到預期的效果?反正像SQL連接?

+0

是我的回答對您有所幫助?或者您是否需要更多信息,即我沒有提供足夠的細節? – thriqon

回答

1

是的,這是可能的!您將必須在此發出複合密鑰,如下所示:["A", 1]代表的值,idA結尾。

例如在地圖:

function (doc) { 
    for (var k in doc) { 
     if (k !== '_id' && k !== 'rev') { 
      emit([doc._id.substr(doc._id.length - 1), k.substr(k.length - 1)], 
       doc[k]); 
     } 
    } 
} 

爲了減少您要使用的內置函數_sum性能。

然後可以使用group=true作爲URL參數,可能通過使用startkeyendkey(例如["A"]["A", {}])限制值,以只有那些具有後綴A查詢這些總和。

在這種情況下,結果將是:

{"rows":[ 
    {"key":["A","1"],"value":12}, 
    {"key":["A","2"],"value":13}, 
    {"key":["B","1"],"value":21}, 
    {"key":["B","2"],"value":20} 
]} 
+0

它有幫助,現在我有另一個問題,這是這個問題的後果:請看看 http://stackoverflow.com/questions/18079917/couchdb-view-using-another-view – user2625363