为什么CouchDB会减少函数接收键#39;作为一个论点

时间:2017-10-12 10:23:42

标签: mapreduce couchdb

使用CouchDB reduce功能:

function(keys, values, rereduce) {
  // ...
}

这就像这样调用:

reduce(  [[key1,id1], [key2,id2], [key3,id3]],    [value1,value2,value3],   false   ) 

问题1

将密钥传递给reduce函数的原因是什么?我只使用reduce函数编写了相对简单的CouchDB视图,并且想知道接收[key1, docid], [key2, docid], etc列表的用例是什么。

另外。有没有时间key1 != key2 != keyX执行reduce函数?

问题2

CouchDB的MapReduce实现允许rereduce=true,在这种情况下,reduce函数被调用如下:

reduce(null,  [intermediate1,intermediate2,intermediate3],  true)

其中keys参数为null(与rereduce=false时不同)。如果在keys时有用,为什么在这种情况下没有rereduce=false参数的用例?

1 个答案:

答案 0 :(得分:1)

  

keysrereduce = true参数的用例是什么?

没有。这就是keys参数在这种情况下为空的原因。

来自the documentation(强调补充):

  

减少和重新减少功能

     

redfun(keys,values [,rereduce])

     

参数:

     
      
  • keys - 相关地图功能结果的docid-key对数组。 如果正在运行rereduce(具有真实值),则始终为null。
  •   
  • values - 地图函数结果值数组。
  •   
  • rereduce - 表示重新减少运行的布尔标志。
  •   

或许你要问的是:为什么reducerereduce都使用相同的功能?我希望有一些历史,但我也可以想象它是因为相同的逻辑可以用于这两个函数并且没有单独的函数定义重复可以很常见减少。假设一个简单的sum reduce函数:

function(keys, values) {
    return sum(values);
}

此处keysrereduce都可以完全忽略。许多其他(重新)减少函数遵循相同的模式。如果必须使用两个函数,那么必须指定两个相同的函数。

回应评论中的其他问题:

  

rereduce=false时的键参数有哪些用例?

请记住,基于地图功能,keysvalues可以是任何内容。常见的模式是emit([foo,bar,baz],null)。也就是说,如果您关心的所有数据都已存在于密钥中,则该值可能为null。在这种情况下,任何比简单sum更复杂的reduce函数都需要使用密钥。

此外,对于分组操作,使用键是有意义的。考虑具有emit(doc.countryCode, ... )的map函数,可能的(不完整的)reduce函数:

function(keys, values, rereduce) {
    var sums = {},
    if !rereduce {
        for (var i = 0; i < keys.length; i++) {
            sums[keys[i]]++;
        }
    }
    return sums;
}

然后给出文件:

  • {"countryCode": "us", ...}
  • {"countryCode": "us", ...}
  • {"countryCode": "br", ...}

您将获得以下值的发布值(来自地图函数):

  • ["us", ...]
  • ["br", ...]

你的结果是:

{"us": 2, "br": 1}