【问题标题】:mapreduce between consecutive documents连续文档之间的mapreduce
【发布时间】:2015-01-05 10:14:39
【问题描述】:

设置:

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

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。我不确定是否需要将集合放入内存并在那里执行,我还能如何解决这个问题?

【问题讨论】:

  • 不要明白这一点。集合或“查询”中的所有内容都将使用相同的“0”键值发出。如果您还正确阅读了mapReduce 文档,那么您应该会看到这是如何以非常基本的方式失败的。您不能从“reduce”返回与从“map”返回不同的数据结构。也许您应该解释您的“意图”以及您正在尝试但不起作用的代码。
  • @NeilLunn 我想发出“对”,这样我就可以在下面的 MapReduce 中迭代它们。 “0”键是让所有文档到reduce 函数,在那里它们成对制动。我知道这不符合文档,但我想不出另一种制作方法。
  • 我明白你的意图。但是这种方法是错误的,当您考虑可用的文档时,实际上非常简单。

标签: mongodb mapreduce mongodb-query


【解决方案1】:

MongoDB 的 mapReduce 函数处理您提出的问题的方法与您用于解决问题的方法不同。这里的关键因素是“保留”“上一个”文档以便与下一个文档进行比较。

支持这一点的实际机制是“范围”功能,它允许在整个代码中使用一种“全局”变量方法。正如您将看到的,您在考虑什么时候提出的问题根本不需要“减少”,因为没有“分组”,只是发出文档“对”数据:

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

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

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

【讨论】:

  • @shevski 答案中已经给出的链接告诉您,声明的变量是“全局变量”,它们实际上适用于所有“映射”/“减少”和“最终确定”阶段的“全局”范围在需要的地方。
  • 只有 map() 阶段的 Map/Reduce 最好写成 find() 查询并通过应用程序代码进行迭代。对于可预测的“连续”文档,还需要定义排序顺序。
  • @Stennie 一般同意,但大多数人都在寻找某种方式让这种情况发生在服务器上,而不是与客户端交互。我相信这实际上是我在几个小时前回答的最后一个带有 mapReduce 标记的问题中所说的话。我会根据所问的内容来回答。
  • @NeilLunn 您需要在else 语句中在emit 之后推进last
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多