设定:
我收到了一个包含以下条目的大集合
Name - String
Begin - time stamp
End - time stamp
问题:
我想在文档之间找到差距,使用map-reduce范例。
方法
我正在尝试设置新的对mid
集合,之后我可以使用$unwind
和Pair[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文档上限,因此文档数量有限。我不确定是否需要将集合存入内存并在那里进行,我还能如何解决这个问题?
答案 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;为了保留最后一个文档,代码既简单又有效。