需要解释couchdb的reduce函数

9

来自http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

CouchDB中的reduce函数定义如下:

function (key, values, rereduce) {
    return sum(values);
}
  • key将是一个元素为[key,id]形式的数组的数组
  • values将是针对键中各元素发出的值的数组
  • 即reduce([ [key1,id1], [key2,id2], [key3,id3] ], [value1,value2,value3], false)

我无法理解数组中的键何时/为什么会包含不同的键值。如果键的数组包含不同的键值,我该如何处理?

例如,假设我的数据库包含以下形式的帐户之间的移动。

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

我希望有一个视图可以显示账户余额。

我的map函数做了以下事情:

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

我的 reduce 函数做的是:

返回 values 的总和;

我似乎得到了预期的结果,但是我无法理解我的 reduce 函数会获得不同的 key 值的可能性。

我的 reduce 函数是否需要先将 key 值分组?在这种情况下我应该返回什么样的结果呢?

1个回答

3

默认情况下,Futon会“分组”你的结果,这意味着你会得到每个键(在你的情况下是一个账户)的新减少。分组功能就是为了这种情况。

通过原始的HTTP API,你将获得所有账户的总减少,这可能没有什么用。因此,请记住在你自己的应用程序中使用group=true,以确保你获得每个账户的摘要。


在这种情况下,您是否可以相信获取键参数中所有值具有相同键值的保证? - Alan
你将会在HTTP查询结果中获得所有的值。换句话说,你的余额将是正确的。然而,你不能依赖于所有的值一次性传递给你的reduce()函数。这是CouchDB的主要权衡之一。 - JasonSmith
换句话说,您提到的函数将起作用,因为假设 group=true 时,它将始终累加一个帐户。当另一个帐户开始时,该值将重置为 0。 - JasonSmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接