最好用一个例子来解释这个问题:
集合包含一个事件的一个文档,该事件可以是某个程序的“开始”事件或“停止”事件。
例如,当程序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方法中不可能做到这一点?