连续文档之间的 mapreduce
mapreduce between consecutive documents
设置:
我得到了一个包含以下条目的大型集合
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 的文档上限,这适用于有限数量的文档。我不确定是否需要将集合放入内存并在那里执行,我还能如何解决这个问题?
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"来保留最后一个文档那么代码既简单又高效。
设置:
我得到了一个包含以下条目的大型集合
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 的文档上限,这适用于有限数量的文档。我不确定是否需要将集合放入内存并在那里执行,我还能如何解决这个问题?
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"来保留最后一个文档那么代码既简单又高效。