【问题标题】:Map reduce with nested values in MongoDB在 MongoDB 中使用嵌套值映射 reduce
【发布时间】:2015-12-21 07:50:05
【问题描述】:

我有一个嵌套的每小时计数器数据结构http://pastebin.com/KgbsYBW7。嵌套级别的计数是恒定的,但值可以不同或相似。但是如果我运行地图功能:

 function () { emit(this.date, this.data); }

那么并非所有日期值的条目都减少了。 如果我使用:

 function () { emit(this.hour, this.data); }

然后所有行都减少了。 我知道,该地图减少了使用类似数据的情况,但是如何按“日期”聚合我的条目?

【问题讨论】:

    标签: mongodb mapreduce


    【解决方案1】:

    如果您想减少一天的数据,您需要为这一天设置相同的时间。

    你可以这样做:

    function () {
        var date = new Date(this.date.getFullYear(), this.date.getMonth(), this.date.getDate());
        emit(date, this.data);
    }
    

    【讨论】:

    • 我需要按日期汇总任何范围的数据。
    • 所以你有 date_from, date_to 并且想要查看日期范围 [date_from, date_to] 中每一天的聚合结果。对吗?
    • 是的,我使用带有日期范围的 $gte / $lte 的 map reduce 查询
    【解决方案2】:

    为了正确的结果,命令 ma​​pReduce 应该使用 sort 参数执行,因为映射的值可能会发送到分离的 reduce 函数:

    排序前

    { ISODate("2015-12-17T00:00:00Z") } => [ { data : {}}, { data : {}}]
    { ISODate("2015-12-18T00:00:00Z") } => [ { data : {}}}]
    { ISODate("2015-12-17T00:00:00Z") } => [ { data : {}}, { data : {}}, { data : {}}]
    { ISODate("2015-12-19T00:00:00Z") } => [ { data : {}}]
    

    带排序 {sort : { hour : 1}}

    { ISODate("2015-12-17T00:00:00Z") } => [ { data : {}}, { data : {}},{ data : {}}, { data : {}}, { data : {}}]
    { ISODate("2015-12-18T00:00:00Z") } => [ { data : {}}}]
    { ISODate("2015-12-19T00:00:00Z") } => [ { data : {}}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2011-11-08
      • 2021-11-06
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多