Требуется объяснение функции couchdb reduce

Из http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

Функция сокращения couchdb определяется как

function (key, values, rereduce) {
    return sum(values);
}
  • key будет массивом, элементами которого являются массивы формы [key, id]
  • values ​​будет массивом значений, испускаемых для соответствующих элементов в ключах
  • т.е. уменьшить ([[ключ1, идентификатор1], [ключ2, идентификатор2], [ключ3, идентификатор3]], [значение1, значение2, значение3], ложь)

Мне сложно понять, когда и почему массив ключей может содержать разные значения ключей. Если массив ключей содержит разные значения ключей, как мне с этим справиться?

В качестве примера предположим, что моя база данных содержит перемещения между учетными записями формы.

{"amount":100, "CreditAccount":"account_number", "DebitAccount":"account_number"}

Мне нужен вид, показывающий баланс аккаунта.

Моя функция карты:

emit( doc.CreditAccount, doc.amount )
emit( doc.DebitAccount, -doc.amount )

Моя функция уменьшения:

возвращаемая сумма (значения);

Кажется, я получаю ожидаемые результаты, однако я не могу согласовать это с возможностью того, что моя функция уменьшения получает разные ключевые значения.

Должна ли моя функция сокращения сначала группировать ключевые значения? Какой результат я верну в таком случае?


person Alan    schedule 03.05.2010    source источник


Ответы (1)


По умолчанию Futon «группирует» ваши результаты, что означает, что вы получаете новое сокращение для каждого ключа в вашем случае, учетной записи. Групповая функция предназначена именно для этой ситуации.

По необработанному HTTP API вы получите одно общее сокращение для всех учетных записей, что, вероятно, бесполезно. Поэтому не забудьте использовать group = true в вашем собственном приложении, чтобы быть уверенным, что вы получаете сводки для каждой учетной записи.

person JasonSmith    schedule 04.05.2010
comment
Можете ли вы рассчитывать на получение всех значений в ключевом параметре с тем же значением ключа в этом случае? - person Alan; 04.05.2010
comment
Вы получите все значения в результате вашего HTTP-запроса. Другими словами, ваш баланс будет правильным. Однако вы не можете полагаться на то, что все значения будут переданы вашей reduce() функции за один раз. Это один из основных компромиссов CouchDB. - person JasonSmith; 04.05.2010
comment
Другими словами, указанная вами функция будет работать, потому что при условии, что group = true, она всегда будет накапливаться для одной учетной записи. Когда запускается другая учетная запись, значение сбрасывается обратно на 0 для вас. - person JasonSmith; 04.05.2010