【发布时间】:2015-01-05 10:14:39
【问题描述】:
设置:
我得到了一个包含以下条目的大型集合
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”键值发出。如果您还正确阅读了mapReduce 文档,那么您应该会看到这是如何以非常基本的方式失败的。您不能从“reduce”返回与从“map”返回不同的数据结构。也许您应该解释您的“意图”以及您正在尝试但不起作用的代码。
-
@NeilLunn 我想发出“对”,这样我就可以在下面的 MapReduce 中迭代它们。 “0”键是让所有文档到
reduce函数,在那里它们成对制动。我知道这不符合文档,但我想不出另一种制作方法。 -
我明白你的意图。但是这种方法是错误的,当您考虑可用的文档时,实际上非常简单。
标签: mongodb mapreduce mongodb-query