couchdb,禁用rereduce

时间:2012-03-18 17:23:06

标签: couchdb mapreduce

我正试图从沙发数据库中获取一个键值对。关键是玩家ID,价值是轮到他们的游戏数量。我有一个map方法,可以成功获取playerID,gameID的列表,其中playerID是谁为gameID转。我的reduce函数是一个简单的长度调用。

function(keys, values){
  return values.length;
}

当我从Futon运行时,它运行正常。我得到了示例输出: 5,11 6,3

然而,当我从Divan(C#lib for couchdb)调用它时,我得到了结果 null,14

我的猜测是通过rereduce将它们合并为一个项目。有没有办法禁用rereduce?

感谢。

-Nick

1 个答案:

答案 0 :(得分:2)

不,你不能禁用rereduce。但是,这里的区别在于,在调用您的视图时,Futon正在添加group = true,但Divan不是,这解释了不同的结果。

你应该用“_count”替换你的reduce函数,它正确处理reduce和re-reduce案例。您的函数返回values数组的长度,这仅适用于reduce情况。 javascript中的正确解决方案看起来像这样;

function(keys, values, rereduce) {
  if (rereduce) {
    return sum(values);
  } else {
    return values.length
  }
}

在reduce调用中,values数组包含您作为值发出的任何内容,每个发出一个条目。既然你在计算,你就不在乎那个价值是什么,只关注它们中有多少。在re-reduce调用中,values数组包含reduce调用先前发出的值。这里,values数组的长度完全不相关,而是需要前一个reduce阶段的长度之和。