沙发基本地图减少查询

时间:2016-02-25 20:31:16

标签: mapreduce couchdb couchbase

我有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)

我只想在“否”字段上进行分组,但显示任何城市。

1 个答案:

答案 0 :(得分:1)

CouchDB文档通常会警告不要通过执行此类操作来滥用reduce函数,因此可能需要使用您期望在生产中使用的数据集进行测试。

你可能最好使用你拥有的地图功能的简单视图和doc.Value上的reduce函数和。两次调用,一次使用查询参数?reduce=false&key=1&limit=1,再次使用?group=true&key=1

说了这么多,这可能会扼杀你的表现,这可以在一次查询中做到你想要的。

地图功能:

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

减少功能:

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]}
]}