Mapreduce 自定义Couchbase减少到只计算某些值

Mapreduce 自定义Couchbase减少到只计算某些值,mapreduce,couchbase,Mapreduce,Couchbase,具有以下地图: function (doc, meta) { emit(dateToArray(doc.timestamp), doc.user_id); } 我需要对此reduce进行哪些更改才能获得多次出现的用户ID function(key, values, rereduce) { var counts = {}, id; for (var i = 0; i < values.length; i++) { id = values[i].replace('-',

具有以下地图:

function (doc, meta) {
  emit(dateToArray(doc.timestamp), doc.user_id);
}
我需要对此reduce进行哪些更改才能获得多次出现的
用户ID

function(key, values, rereduce) {
  var counts = {}, id;
  for (var i = 0; i < values.length; i++) {
    id = values[i].replace('-', '_');
    counts[id] = counts[id] || 0;
    counts[id] = counts[id] + 1;
  }
  var total = 0;
  for (id in counts) {
    if (counts[id] > 1) total++;
  }
  return total;
}
注意
返回id行。它返回一个修改后的uuid,前缀为“id_Uid”,就像您通过查看代码所期望的那样


但是,如果我将该行更改为
返回计数或<代码>返回总计,Couchbase的结果是“此视图的结果为空”。给出了什么?

这是一个痛苦的调试过程,但最后的解决方案是:

function(key, values, rereduce) {
  var counts = {}, total = 0, id;
  if (rereduce) {
    for (var set in values) {
      for (var i in values[set]) {
        counts[i] = (counts[i] || 0) + values[set][i];
      }
    }
    for (f in counts) {
      if (counts[f] > 1) total++;
    }
    return total;
  } else {
    for (var i in values) {
      id = 'id_' + values[i].replace(/-/g, '_');
      counts[id] = (counts[id] || 0) + 1;
    }
    return counts;
  }
}

另外一个教训是:Couchbase不会返回reduce操作中的大对象。必须了解更多信息。

注意,有一个“debug=true”参数可以传递给视图查询,该查询将记录ns_服务器和单个视图执行级别的更多信息。如果您有一个测试显示了reduce操作的含义,那么最好将其归档到couchbase.com/issues.:facepalm:该参数就在admin中,我没有想到要打开它,谢谢。我没有测试,我只是为了调试而尝试返回
counts
对象,而不是
total
,但它不起作用,从我尝试的变化来看,它似乎是由对象的大小引起的:
{'id_abc…':1,'id_xyz…':2,…}
,总共有数百个键。
function(key, values, rereduce) {
  var counts = {}, total = 0, id;
  if (rereduce) {
    for (var set in values) {
      for (var i in values[set]) {
        counts[i] = (counts[i] || 0) + values[set][i];
      }
    }
    for (f in counts) {
      if (counts[f] > 1) total++;
    }
    return total;
  } else {
    for (var i in values) {
      id = 'id_' + values[i].replace(/-/g, '_');
      counts[id] = (counts[id] || 0) + 1;
    }
    return counts;
  }
}