2010-05-03 2 views
9

От http://wiki.apache.org/couchdb/Introduction_to_CouchDB_viewsПотребность Объяснение CouchDB уменьшить функцию

CouchDB снижают функцию определяется как

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

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

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

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

Я хочу вид, что дает баланс счета.

Моя функция карта делает:

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

Моя функция уменьшения делает:

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

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

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

ответ

3

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

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

+0

Можете ли вы полагаться на получение всех значений в ключевом параметре с тем же значением ключа в этом случае? – Alan

+0

Вы * будете * получать все значения в результате вашего HTTP-запроса. Другими словами, ваш баланс будет правильным. Однако вы ** не можете ** полагаться на все значения, передаваемые вашей функции 'reduce()' за один снимок. Это один из основных компромиссов CouchDB. – JasonSmith

+0

Другими словами, функция, которую вы указали, будет работать, потому что ** при условии, что group = true ** она всегда будет накапливаться для одной учетной записи. Когда начнется другая учетная запись, значение вернется к 0 для вас. – JasonSmith