减少输出多个值的功能

时间:2014-02-13 15:06:09

标签: couchdb

我有一个包含多个用户的Couch数据库,我想创建一个reduce函数,为每个用户输出一个数字。

我们说这是我的数据库:

{
   user: "A",
   event: "x",
   time: 100
}
{
   user: "A",
   event: "y",
   time: 150
}
{
   user: "B",
   event: "x",
   time: 300
}
{
   user: "B",
   event: "y",
   time: 375
}

我想知道每个用户的事件x和y之间的时间。也就是说,我想输出类似

的输出
{
   user: "A",
   xyTime: 50
}
{
   user: "B",
   xyTime: 75
}

有办法吗?

1 个答案:

答案 0 :(得分:0)

您可以将地图功能定义为:

function(doc){
  emit(doc.user, {event:doc.event, time: doc.xyTime});
}

在您的reduce中,您可以迭代所有值:

function(keys,values){
  var xTime = 0
  var yTime = 0;
  var length = values.length;
  for(var i = 0; i < length; i++){
    var eventTime = parseInt(values[i].time, 10);
    if(values[i].event === "x"){
      xTime += eventTime;
    } else {
      yTime += eventTime;
    }
  }
  var xyTime = Math.abs(xTime - yTime);

  return { user: keys[0], xyTime:  xyTime };
}