连续文档之间的 mapreduce

mapreduce between consecutive documents

设置:

我得到了一个包含以下条目的大型集合

Name - String 
Begin - time stamp
End - time stamp

问题:

我想获取文档之间的间隙,使用 map-reduce 范式。

方法:

我正在尝试设置一组新的对 mid,之后我可以使用 $unwindPair[1].Begin - Pair[0].End

计算它们的差异
function map(){
    emit(0, this)
}
function reduce(){
    var i = 0;
    var pairs = [];
    while ( i < values.length -1){
        pairs.push([values[i], values[i+1]]);
        i = i + 1;
    }
    return {"pairs":pairs};
}
db.collection.mapReduce(map, reduce, sort:{begin:1}, out:{replace:"mid"})

由于 16MB 的文档上限,这适用于有限数量的文档。我不确定是否需要将集合放入内存并在那里执行,我还能如何解决这个问题?

MongoDB 的 mapReduce 函数处理您提出的问题的方式与您用来解决它的方法不同。这里的关键因素是 "keeping" "previous" 文档以便与下一个进行比较。

支持这一点的实际机制是 "scope" 功能,它允许在整个代码中使用一种 "global" 变量方法。正如您将看到的,当考虑到这一点时,您所问的内容根本不需要 "reduction",因为没有 "grouping",只是文档 "pair" 数据的排放:

db.collection.mapReduce(
    function() {
        if ( last == null ) {
           last = this;
        } else {
            emit( 
                {
                    "start_id": last._id,
                    "end_id": this._id
                },
                this.Begin - last.End
            );
            last = this;
        }
    },
    function() {}, // no reduction required
    {
        "out": { "inline": 1 },
        "scope": { "last": null }
    }
)

根据您的尺寸要求输出一个集合。

但是这种方式通过使用一个"global"来保留最后一个文档那么代码既简单又高效。