Что такое эквивалент CouchDB функции агрегации SQL COUNT (*)?
Да, я являюсь SQL-жокеем (sorta), входящим в CouchDb Map/Reduce world. Я подумал, что я понял, как эквивалент функции агрегатора COUNT (*) SQL для наборов данных CouchDB со следующим:
Карта
function(doc) {
emit(doc.name, doc);
}
Уменьшить:
function(keys, values, rereduce){
return values.length;
}
Я думал, что работал, возвращая что-то вроде:
"super fun C" 2
"super fun D" 2
"super fun E" 2
"super fun F" 18
... но не совсем. Когда я добавляю запись, этот счет сильно варьируется. Иногда счет действительно уменьшается, что было очень удивительно. Я делаю что-то неправильно? Может быть, я не совсем понимаю концепцию возможной последовательности?
Ответы
Ответ 1
Похоже, что ваши результаты уменьшаются. То есть reduce
вызывается более одного раза для каждого ключа, а затем снова вызывается с этими результатами. Вы можете обработать это с помощью функции reduce
, например:
function(keys, values, rereduce) {
if (rereduce) {
return sum(values);
} else {
return values.length;
}
}
В качестве альтернативы вы можете изменить функцию map
так, чтобы значения всегда были количеством документов:
// map
function(doc) {
emit(doc.name, 1);
}
// reduce
function(keys, values, rereduce) {
return sum(values);
}
Ответ 2
В вашем уменьшении просто поставьте:
_count
Вы также можете получить сумму, используя:
_sum
поэтому в основном уменьшите: "_sum" или уменьшите: "_count" и убедитесь, что значение, которое выбрала ваша карта, является допустимым целым числом (числовое значение)
См. "Встроенные функции сокращения" .