如何在mongodb mapreduce中实现需要非关联reducer的计算

时间:2018-03-16 08:51:11

标签: javascript mongodb mapreduce

最好通过一个例子来解释这个问题:

一个集合包含一个事件的一个文档,该事件可以是"开始"事件或"停止"一些程序的事件。

例如,当程序A在时间12:00开始运行时,它会写入文档

{ program_name: 'A', time: 12:00, event: 'Start' }

当它在12:10结束时,它会写另一个文件

{ program_name: 'A', time: 12:10, event: 'Stop' }    

因此在集合中有许多对不同程序的Start-Stop文档对。

如何通过map reduce计算每个程序的已用时间?

例如,map和reducer函数是:

function map() {
    emit( this.program_name, { time: this.time, event: this.event} )
}

function reduce(key, values) {
    var timeElapsed = 0
    if ( values[0].event == 'Start' ) {
        timeElapsed = values[1].time - values[0].time
    }
    else {
        timeElapsed = values[0].time - values[1].time
    }

    return timeElapse;
}

上面的实现提供了关于我想要做什么的想法,但它违反了许多rules所说的关联,幂等和交换。

如何实现mapreduce以使其符合mongodb reducer规则,或者在mapreduce方法中不可能这样做?

1 个答案:

答案 0 :(得分:1)

reduce函数可以是这样的:

function reduce(key, values) {
    return values.reduce((res, e) => Object.assign({[e.event]:e.time}, res, e), {})
}

数学应该在finalize函数中完成:

function(key, reducedValue) {
    return reducedValue.Stop - reducedValue.Start;
}