需要解释couchdb reduce函数吗

需要解释couchdb reduce函数吗,couchdb,couchdb-futon,Couchdb,Couchdb Futon,从 couchdb reduce函数定义为 键将是一个数组,其元素 是形式为[key,id]的数组 值将是一个值数组 为相应的元素发射 钥匙 i、 e.减少([[key1,id1],[key2,id2],[key3,id3],[value1,value2,value3],false) 我无法理解键数组何时/为什么包含不同的键值。如果键数组包含不同的键值,我将如何处理它 例如,假设我的数据库包含表单帐户之间的移动 我想要一个能给出账户余额的视图 “我的地图”功能执行以下操作: 我的reduce

couchdb reduce函数定义为

  • 键将是一个数组,其元素 是形式为[key,id]的数组
  • 值将是一个值数组 为相应的元素发射 钥匙
  • i、 e.减少([[key1,id1],[key2,id2],[key3,id3],[value1,value2,value3],false)
我无法理解键数组何时/为什么包含不同的键值。如果键数组包含不同的键值,我将如何处理它

例如,假设我的数据库包含表单帐户之间的移动

我想要一个能给出账户余额的视图

“我的地图”功能执行以下操作:

我的reduce函数执行以下操作:

返回和(值)

我似乎得到了预期的结果,但是我无法将这与reduce函数得到不同键值的可能性相协调

我的reduce函数是否应该首先对键值进行分组?在这种情况下,我将返回什么样的结果?

默认情况下,Futon“分组”您的结果,这意味着您在您的情况下,每键获得一个新的reduce,即帐户。组功能正是针对这种情况


通过原始HTTP API,您将获得一个针对所有帐户的总reduce,这可能没有什么用处。因此,请记住在您自己的应用程序中使用group=true,以确保每个帐户都有摘要。

在这种情况下,您能否依靠使用相同的key值获取key参数中的所有值?您将在HTTP查询的结果中获取所有值。换句话说,你的平衡是正确的。但是,您不能依靠一次将所有值传递给
reduce()
函数。这是CouchDB的主要权衡之一。换句话说,您所述的函数将起作用,因为假设group=true,它将始终为一个帐户累积。当另一个帐户启动时,该值将为您重置回0。
function (key, values, rereduce) {
    return sum(values);
}
{"amount":100, "CreditAccount":"account_number", "DebitAccount":"account_number"}
emit( doc.CreditAccount, doc.amount )
emit( doc.DebitAccount, -doc.amount )