在CouchDB中,如何在reduce函数中发出键值?

时间:2012-08-15 19:12:44

标签: json couchdb reduce

目前,我的代码看起来像

function(keys, values, rereduce){
    return {"key":keys[0][0],"count":values.length};
}

运行此操作后,生成的行为:

key = None, value={u'count':3,u'key':u'123456'}

这适用于我的目的,因为我只是在value属性中解析JSON字符串,但这似乎是错误的做事方式。

那么我如何让reduce函数发出一个键值,而不是None?

3 个答案:

答案 0 :(得分:1)

我认为您的代码仅适用于首次减少。它无法重新减少。阅读Introduction to CouchDB Views: 1.2.2 Reduce Functions。当第三个参数(key)为reduce()时,请注意rereduce声明的第一个参数(true)。

我还认为count无效,因为rereduce==true。它应该总结从早期减少的计数,而不是计算计数

答案 1 :(得分:0)

没有足够的上下文可以确定,但您可能会考虑以不同的方式减少功能,以及它们的用途。 From the CouchDB guide

  

如果你没有将值减少到单个标量值或固定数量的小标量值的小型固定大小的对象或数组,那么你可能做错了。

你的例子确实减少到一些小的东西,但这看起来像是巧合。如果要输出某种键,可能需要一个map函数。或者,重新思考你正在做什么以及它如何适应MapReduce模型。

答案 2 :(得分:0)

我弄清楚发生了什么。 reduce函数创建了一个单一的标量值,而我想要的是一个键值对列表。发生这种情况是因为我没有使用grouping

通过在我的查询中添加'group = true'参数,使用_count作为我的reduce现在生成

key = 123456, value=3

没有分组意味着所有数据都缩减为单个标量值。通过启用分组,只会使用具有相同键值的项目来减少事情,这就是我想要的。