2016-02-25 49 views
2

我有一個3 JSON文檔長椅底圖減少查詢

文獻1

"No" : 1 
"City" : "Patiala" 
"Value" : 10 

文獻2

"No" : 1 
"City" : "Delhi" 
"Value" : 11 

文獻3

"No" : 1 
"City" : "Patiala" 
"Value" : 11 

我要像

輸出
1 <Delhi or Patiala any one city> 32 

我試着查詢與組2級

map 
function(doc, meta) 
{ 
    emit(doc.No,[doc.Value,doc.City]); 
} 

減少

function(key,values,rereduce){ 
    if(!rereduce){ 
     var sum=0; 
     var s=[]; 
     var v=[]; 
     v=values[1]; 
     s=values[0]; 
     for(i=0;i<s.length;++i){ 
      sum+= s[i]; 
     } 
     return (sum,v[0]); 
    }else{ 
     var sum=0; 
     var s=[]; 
     var v; 
     v=values[1]; 
     s=values[0]; 
     for(i=0;i<s.length;++i){ 
      sum+= s[i]; 
     } 
     return (sum,v); 
    } 
} 

,並得到了以下錯誤

(Reducer: Error building index for view `my_first_view`, reason: TypeError: Cannot read property 'length' of null) 

我只想通過做組「沒有'領域,但顯示任何城市。

+0

您可以使用組級別屬性更改該值。 –

+0

如果組級別爲1,它只顯示城市,但如果組級別爲2,則它將城市和城市組合起來。我要的是結合所有的「否」字段顯示任何1個城市 –

+0

你能簡單地預期產出增加的問題? –

回答

1

CouchDB的文檔通常警告不要濫用做這種事情減少功能,所以它可能是值得的大小,你在生產中預期的數據集檢驗出來。

你可能是最好關閉用你所擁有的地圖功能,在doc.Value reduce函數和一個簡單的示意圖。帶有查詢參數?reduce=false&key=1&limit=1?group=true&key=1調用此兩次,一次又一次。

說了這麼多,這可能會殺了你的表現,這對你在單個查詢想要的東西。

地圖功能:

function (doc) { 
    emit(doc.No,[doc.City, doc.Value]); 
} 

Reduce函數:

function (keys, values, rereduce) { 
    var city; 
    var sum = 0; 
    for (var i = 0; i<values.length; i++){ 
     if (!city){ 
     city = values[i][0]; 
     } 
     sum = sum + values[i][1]; 
    } 
    return [city, sum]; 
} 

查詢網址:

http://host:5984/db/_design/views/_view/view?group=true&key=1 

給出結果:

{"rows":[ 
{"key":1,"value":["Patiala",32]} 
]}