Что такое эквивалент 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" и убедитесь, что значение, которое выбрала ваша карта, является допустимым целым числом (числовое значение)

См. "Встроенные функции сокращения" .