【问题标题】:Data-based MapReduce issue on MongoDBMongoDB 上基于数据的 MapReduce 问题
【发布时间】:2014-08-01 11:56:50
【问题描述】:

我在 MongoDB 中使用 MapReduce 以按天进行聚合。在地图代码上,我有以下sn-p来获取一年中的日期:

var day = Date.UTC(this.time.getFullYear(), this.time.getMonth(), this.time.getDate(), 1, 0, 0);

在大多数情况下,它运作良好。但是,显然存在时区问题,这会强制将时间戳移到前一个日期。例如,从这个查询的结果中获得的文档:

{'time' : {'$gte' : new Date(2014, 0, 1, 0), '$lt' : new Date(2014, 0, 1, 9)}}

最终成为 2013-12-31 17:00:00.000Z 和查询的人:

{'time' : {'$gte' : new Date(2014, 0, 1, 9), '$lt' : new Date(2014, 0, 1, 23)}}

最终是 2014-01-01 17:00:00.000Z。我该如何控制?

【问题讨论】:

  • 今天是谁的“日子”?查询的人?存储数据的人?数据的对象是谁?您在哪些方面进行汇总?如果您按 UTC 汇总 - 那么您可能没有实现其中的任何。请记住,由于地球自转和时区的使用,每个人对什么是“一天”都有不同的概念。最重要的是,由于夏令时,并非所有“天”都是 24 小时。

标签: mongodb timezone timestamp


【解决方案1】:

在构建日期的方式上保持一致。 Date.UTC 给出自 1970 年 1 月 1 日以来的毫秒数。Date 构造函数根据您的本地系统设置的时区返回一个 Date 对象。那是根本问题。代码中遗漏了太多内容,我无法自信地填写正确的语句,但您应该能够做到。

【讨论】:

    猜你喜欢
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2017-07-05
    • 2014-08-01
    • 2017-06-21
    相关资源
    最近更新 更多