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