连续文件之间的mapreduce

时间:2015-01-05 10:14:40

标签: mongodb mapreduce mongodb-query

设定:

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

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文档上限,因此文档数量有限。我不确定是否需要将集合存入内存并在那里进行,我还能如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

MongoDB的mapReduce函数有一种不同的处理方法,而不是用来解决它的方法。这里的关键因素是&#34;保持&#34; &#34;之前&#34;文件,以便与下一个进行比较。

支持此功能的实际机制是&#34;范围&#34;功能,允许一种&#34;全球&#34;在整体代码中使用的可变方法。正如您将看到的那样,当您考虑到这一点时,您所要求的不会减少&#34;减少&#34;因为没有&#34;分组&#34;,只是文件的排放&#34;对&#34;数据:

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

将一个集合作为您的尺寸所需的输出。

但是通过这种方式使用&#34; global&#34;为了保留最后一个文档,代码既简单又有效。