Имея следующую карту:
function (doc, meta) {
emit(dateToArray(doc.timestamp), doc.user_id);
}
Какие изменения мне нужно внести в это сокращение, чтобы получить user_ids
, которые происходят более одного раза?
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;
}
Я пробовал это на простом JS, передавая некоторый массив значений, и он работает так, как я ожидал. Однако отладка на Couchbase затруднена (или я не знаю как), и я не вижу никаких ошибок в файлах error.1
и mapreduce_errors.1
.
Обновление: я проделал некоторую грубую отладку построчно, и вот что у меня есть:
function(key, values, rereduce) {
var counts = {}, total = 0;
for (var i = 0; i < values.length; i++) {
var id = values[i];
if (id.indexOf('id_') != 0) id = 'id_' + values[i].replace(/-/g, '_');
return id;
counts[id] = counts[id] || 0;
counts[id] = counts[id] + 1;
}
for (id in counts) {
if (counts[id] > 1) total++;
}
return total;
}
Обратите внимание на строку return id;
. Он возвращает измененный uuid с префиксом id_, как и следовало ожидать, глядя на код.
Но затем, если я изменю эту строку на return counts;
или return total;
, результатом Couchbase будет «Результаты этого представления пусты». Что дает?