代码之家  ›  专栏  ›  技术社区  ›  palazzo train

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

  •  0
  • palazzo train  · 技术社区  · 8 年前

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

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

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

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

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

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

    因此,在集合中有许多对不同程序的开始-停止文档。

    如何通过map REDUCT计算每个程序的运行时间?

    例如,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 回复  |  直到 8 年前
        1
  •  1
  •   Alex Blex    8 年前

    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;
    }