MongoDB MapReduce-发出一个键/一个值不调用reduce
所以我对mongodb和mapreduce基本上是新手,遇到了这个“怪癖”(或者至少在我看来是怪癖) 假设我的收藏中有这样的对象: {'key':5,'value':5} {‘键’:5,‘值’:4} {‘键’:5,‘值’:1} {‘键’:4,‘值’:6} {'key':4,'value':4} {“键”:3,“值”:0} Mymap函数只发出键和值 我的reduce函数只是简单地将值相加,然后返回它们加1(我这样做是为了检查reduce函数是否被调用) 我的结果如下: {u id':3,'value':0} {“u id”:4,“value”:11.0} {“u id”:5,“value”:11.0} 如您所见,对于键4和键5,我得到了预期的答案11,但是对于键3(在集合中只有一个带有该键的条目),我得到了意外的0MongoDB MapReduce-发出一个键/一个值不调用reduce,mongodb,mapreduce,pymongo,Mongodb,Mapreduce,Pymongo,所以我对mongodb和mapreduce基本上是新手,遇到了这个“怪癖”(或者至少在我看来是怪癖) 假设我的收藏中有这样的对象: {'key':5,'value':5} {‘键’:5,‘值’:4} {‘键’:5,‘值’:1} {‘键’:4,‘值’:6} {'key':4,'value':4} {“键”:3,“值”:0} Mymap函数只发出键和值 我的reduce函数只是简单地将值相加,然后返回它们加1(我这样做是为了检查reduce函数是否被调用) 我的结果如下: {u id':3,'val
这是mapreduce的自然行为吗?为了MongoDB?对于pymongo(我正在使用)?reduce函数将具有相同键的文档合并到一个文档中。如果map函数为特定键发出单个文档(如键3),则不会调用reduce函数 这是mapreduce的自然行为吗 是。“MongoDB不会为只有一个值的键调用reduce函数。values参数是一个数组,其元素是“映射”到键的值对象。”
我意识到这是一个比较老的问题,但我发现我仍然不明白为什么会出现这种行为,以及如何构建map/reduce功能,这样就不成问题了 如果存在一个键的实例,MongoDB不调用reduce函数的原因是因为它不是必需的(我希望这会在稍后变得更有意义)。以下是:
- reduce函数必须返回一个对象,该对象的类型必须与map函数发出的值的类型相同
- valuesArray中元素的顺序不应影响reduce函数的输出
- reduce函数必须是幂等函数
- 在地图中添加了新字段:单个:0
- 在减少中将此字段更改为:单个:1
- 在完成中检查此字段并执行所需操作
$map = new MongoCode("function() { var value = { time: this.time, email_id: this.email_id, single: 0 }; emit(this.email, value); }"); $reduce = new MongoCode("function(k, vals) { // make some need actions here return { time: vals[0].time, email_id: vals[0].email_id, single: 1 }; }"); $finalize = new MongoCode("function(key, reducedVal) { if (reducedVal.single == 0) { reducedVal.time = 11111; } return reducedVal; };");