2016-02-25 54 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]} 
]}