2014-06-26 29 views
2

我需要您關於CouchDB reduce函數的幫助。 我有一些文檔,如:如何返回我在縮減函數中創建的JSON對象

{'about':'1', 'foo':'a1','bar':'qwe'} 
{'about':'1', 'foo':'a1','bar':'rty'} 
{'about':'1', 'foo':'a2','bar':'uio'} 
{'about':'1', 'foo':'a1','bar':'iop'} 
{'about':'2', 'foo':'b1','bar':'qsd'} 
{'about':'2', 'foo':'b1','bar':'fgh'} 
{'about':'3', 'foo':'c1','bar':'wxc'} 
{'about':'3', 'foo':'c2','bar':'vbn'} 

正如你可以看到它們都具有相同的密鑰,只是數值型動物。 我purpse是使用Map/Reduce和我的回報預期是:

'rows':[ 'keys':'1','value':{'1':{'foo':'a1', 'at':'rty'}, 
          '2':{'foo':'a2', 'at':'uio'}, 
          '3':{'foo':'a1', 'at':'iop'}} 
     'keys':'1','value':{'foo':'a1', 'bar','rty'} 
      ... 
     'keys':'3','value':{'foo':'c2', 'bar',vbn'} 
     ] 

這裏是我的地圖功能的結果:

'rows':[ 'keys':'1','value':{'foo':'a1', 'bar','qwe'} 
     'keys':'1','value':{'foo':'a1', 'bar','rty'} 
      ... 
     'keys':'3','value':{'foo':'c2', 'bar',vbn'} 
     ] 

但我Reduce函數不工作:

function(keys,values,rereduce){ 
    var res= {}; 
    var lastCheck = values[0]; 
    for(i=0; i<values.length;++i) 
    { 
    value = values[i]; 
    if (lastCheck.foo != value.foo) 
    { 
     res.append({'change':[i:lastCheck]}); 
    } 
    lastCheck = value; 
    } 
    return res; 
} 

是否可以有我期望的或者我需要使用其他方式?

回答

2

你不應該在reduce函數中這樣做。由於couchdb wiki解釋: -

如果你正在建設中的減少,或者僅轉化價值領域,而不是總結它的複合回報率結構,你可能會誤用此功能。

有,你可以採取替代

  1. 在應用程序層變換的結果兩種方法。使用list function

列表函數很簡單。我會盡力在這裏解釋它們:

列表像視圖保存在設計文檔的關鍵列表下。像這樣:

"lists":{ 

    "formatResults" : "function(head,req) {....}" 

} 

要調用列表功能,你使用這樣

http://localhost:5984/your-database/_design/your-designdoc/_list/your-list-function/your-view-name

這裏的URL是列表功能的一個例子

function(head, req) { 
    var row = getRow(); 
    if (!row){ 
    return 'no ingredients' 
    } 

    var jsonOb = {}; 

    while(row=getRow()){ 
    //construct the json object here 
    } 
    return {"body":jsonOb,"headers":{"Content-Type" : "application/json"}}; 
} 

getRow功能感興趣給我們。它包含視圖的結果。因此,我們可以查詢它像

row.key關鍵

row.value的價值

所有你現在要做的是構建JSON像你想要的,然後send它。

順便說一下,您可以使用log 來調試您的功能。

我希望這會有所幫助。

+0

我看了一下名單功能,但克利不明白它是如何工作的,以及如何使用它的信息。 什麼解決方案最好? – franssois

+0

如果你可以添加一個關於你的reduce函數的簡潔問題的新問題會更好。這個解決方案可能適用於一個小型數據庫,但對於超過幾兆字節的任何東西都是完全沒有效率的。 – Hans

+1

@Akshat Jiwan Sharma非常感謝你,我錯過了爲了讓它工作而必須將url設計文檔的名稱給URL的事實!閱讀後,它似乎真的給我提供我需要的東西!謝謝 !對不起,我不能'投票',因爲我缺乏聲譽 – franssois