2015-11-02 51 views
1

我有一个房地产集合,我运行地图减少mongodb来计算一些基本的统计数据。一切工作正常,但当我在mongohq上运行任务时,我得到了递归结果。地图减少mongodb返回递归结果

让我简化事情有点,而不是真正的减少FN,说减少是:

function(key, values) { 
    return { values: values }; 
} 

地图功能:

function() { 
    emit('price', this.price); 
} 

当我在本地运行的任务,输出是这样的:

{ 
    "values": [ 
    1024.1712707182319, 
    661.0377201728149, 
    651.5957446808511, 
    1553.7073816617014, 
    1128.664171911323 
    ] 
} 

现在有趣的部分,当我在生产db上运行它时,输出如下所示:

{ 
    "values": [ 
    { 
     "values": [ 
     { 
      "values": [ 
      1561.5615615615618, 
      1026.2054507337525, 
      1428.5714285714287 
      ] 
     }, 
     1092.1177587844254, 
     1040.2010050251256, 
     1547.6190476190477 
     ] 
    } 
    ] 
} 

任何想法这里有什么可能是错的?

回答

2

罪魁祸首可能是你的reduce函数。

https://docs.mongodb.org/manual/reference/command/mapReduce/#dbcmd.mapReduce

精简函数必须是幂等。确保下面的语句是正确的:

reduce(key, [ reduce(key, valuesArray) ]) == reduce(key, valuesArray) 

精简函数应该是可交换的:那就是,在valuesArray元素的顺序不应该影响减少函数的输出,从而使下面的语句是正确的:

reduce(key, [ A, B ]) == reduce(key, [ B, A ]) 

希望这有助于

+1

非常感谢。我认为这是问题。不过,一旦我确认,我会接受你的回答。猜猜我必须以它返回一个对象(散列基本上)的方式编写reduce,并且是幂等的。 – rodic