【问题标题】:CouchDB, how calculate two values in one viewCouchDB,如何在一个视图中计算两个值
【发布时间】:2016-06-25 15:24:56
【问题描述】:

我有这样的文件:

{"user": "A","year": "2016","price": 3,"litres": 19900}
{"user": "B","year": "2016","price": 2.3,"litres": 16000}
{"user": "C","year": "2016","price": 2.9,"litres": 15000}
{"user": "A","year": "2015","price": 4,"litres": 12030}
{"user": "B","year": "2015","price": 3,"litres": 20002}
{"user": "C","year": "2015","price": 2.9,"litres": 22000}

我需要按年份计算所有值的总和和一个用户的总和,目标是与一个用户比较全球平均值。

例如,如果我用“A”作为键来调用视图来求和升,我需要在减少以下内容后得到:

["A","2016"] {global: 50900, user: 19900}
["A","2015"] {global: 54032, user: 12030}

谢谢,

迭戈

【问题讨论】:

  • 你有什么理由不能只做 2 次查询吗?
  • 我需要这些值来绘制图表,如果它们组合在一起会更容易。否则我需要将用户值与全局配对,并且用户可能不存在。两个查询可能有不同的行数。

标签: javascript dictionary view couchdb reduce


【解决方案1】:

你不能通过一个电话来做到这一点。如果您交换您的密钥顺序,那么首先是那一年,然后是用户,您可以对具有不同组级别的同一视图进行两次调用。第 1 级组将为您提供全球年度总计,第 2 级组将为您提供按用户总计的年份。

【讨论】:

  • 顺序不重要,我可以重新排列结果。
【解决方案2】:

嗯..这是我的想法:

  1. 您可以使用 POST 设置两个 Key。

    功能(文档){ 变量总计={}; 总计={年份:doc.year,litres:doc.litres}; 发射(doc.user,{用户:总计,年:[总计]}); 发射(“”,{用户:“”,年:[总计]}); }

查询:

curl -X POST http://localhost:5984/test_a/_design/test/_view/test -H "Content-type:application/json" -d '{"keys":["A",""]}'

结果(缩短):

"key":"A","value":{"user":{"year":"2016","litres":19900},"years": [{"year":"2016","litres" :19900}]}}, "key":"A","value":{"user":{"year":"2015","litres":12030},"years":[{"year":"2015","litres" :12030}]}}, "key":"","value":{"user":"","years":[{"year":"2016","litres":19900}]}}, "key":"","value":{"user":"","years":[{"year":"2016","litres":16000}]}}, "key":"","value":{"user":"","years":[{"year":"2016","litres":15000}]}}, "key":"","value":{"user":"","years":[{"year":"2015","litres":12030}]}}, "key":"","value":{"user":"","years":[{"year":"2015","litres":20002}]}}, "key":"","value":{"user":"","years":[{"year":"2015","litres":22000}]}} 如果你然后做一个从两个键收集数据的减少:
function(keys, values, rereduce) {
  var user_sum=0;
  var total_a=[];
  var v_values={};
  var curUser="";
  for (var i=0;i<keys.length;i++) {
    if (keys[i]!="") {
      curUser=keys[i][0];
    }
    values[i].years.forEach(function(year) {
      if (v_values["year_"+year.year]) {
        v_values["year_"+year.year]=
          {year:year.year,  
           litres:v_values["year_"+year.year].litres+year.litres
          };
      }else{
        v_values["year_"+year.year]={year:year.year,litres:year.litres};
      }
   });

 }
 return ({user:curUser,years:v_values})

}

你得到了

{"rows":[
  {"key":"A","value":
    {"user":"A",
     "years":{
       "year_2015":   {"year":"2015","litres":12030},
       "year_2016":{"year":"2016","litres":19900}
     }
    }
  },
 {"key":"","value":
   {"user":"",
    "years":{
      "year_2015":{"year":"2015","litres":54032},
      "year_2016":{"year":"2016","litres":50900}
    }
   }
 }

] }

我有点懒..所以你自己检查reduce / rereduce...

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2011-01-24
    相关资源
    最近更新 更多