2010-05-03 176 views
9

http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views需要CouchDB的说明减少功能

CouchDB的降低函数被定义为

function (key, values, rereduce) { 
    return sum(values); 
} 
  • 键将是一个数组,其元素 的形式是阵列[关键,id]
  • values将是为resp发出的数值 ective元件 在键
  • 即减少我有([[KEY1,ID1],[KEY2,ID2],[KEY3,ID3]],[值1,值2,值3],假)

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

作为示例,假设我的数据库包含表单帐户之间的移动。

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

我希望有一个观点,即给出了一个账户的余额。

我的地图功能的作用:

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

我的减少功能的作用:

返回总和(值);

我似乎得到了预期的结果,但我无法调和这与我的reduce函数获得不同关键值的可能性。

我的缩小函数是否应该先将关键值分组?在这种情况下,我会返回什么样的结果?

回答

3

默认情况下,蒲团对您的结果进行“分组”,这意味着在您的情况下,每个密钥—都会得到新的减少。小组功能正是为了这种情况。

在原始HTTP API上,对于所有可能无用的帐户,您将得到一个总计减少。因此,请记住在您的应用程序中使用group = true以确保您获得每个帐户的摘要。

+0

在这种情况下,您可以依赖于使用相同的键值获取关键参数中的所有值吗? – Alan 2010-05-04 16:04:16

+0

您*将*获取HTTP查询结果中的所有值。换句话说,你的平衡是正确的。然而,你**不能依靠一次性传递给你的'reduce()'函数的所有值。这是CouchDB的主要权衡之一。 – JasonSmith 2010-05-04 18:13:48

+0

换句话说,你陈述的功能将起作用,因为**假设group = true **它总是会累积一个帐户。当另一个帐户启动时,该值将重置为0。 – JasonSmith 2010-05-04 18:20:54