【发布时间】:2013-08-19 16:43:42
【问题描述】:
我有一个 mongodb 集合,其中每个文档都有一些属性和一个 utc 时间戳。我需要从集合中提取数据并使用聚合框架,因为我使用集合中的数据在用户界面上显示一些图表。但是,我需要根据用户的时区进行聚合。假设我知道用户的时区(通过浏览器的请求或以其他方式传递),有没有办法使用聚合框架根据 [client's] 时区进行聚合?
【问题讨论】:
-
您能否更清楚地了解您正在尝试做什么,为什么您不能只转换为客户的时区聚合后?你总是可以使用 mapreduce 而不是聚合框架——它会更慢,但允许你需要做任何类型的临时计算
-
实际上,我需要根据用户的时区为用户生成每周报告。对于报告,我需要使用聚合框架。问题是,我应该在聚合时考虑用户的时区。聚合后我不能这样做,因为这会导致错误的结果。 Map reduce 是一个选项,但我需要这个按需,我在搜索 StackOverflow 时看到它不应该用来代替查询。我希望有办法。
-
我不太了解 MongoDB,无法回答,但我相信该方法类似于我为 RavenDB here 和
Foo_ByDate_MultiZoneindex here 描述的方法。如果 Mongo 允许类似的东西,你会在 Map 中这样做,就像我在 Raven 中那样。 -
没有理由在 MongoDB 中需要这样做。这就是应用层的用途。在 UTC 中进行所有聚合,然后按其时区调整输出。如果用户也更改时区,将所有内容保持在 UTC 中将确保事情保持一致。
-
@Mason - 绝大多数时候,我同意你的观点,应用程序代码是最好的地方。这里的区别在于它是聚合的。要按天分组,您必须知道当天的界限。每个时区都有不同的开始和结束概念,无论是在原始 UTC 术语中,还是在处理 DST 的变化时。如果 Mongo 不允许您在索引地图中执行此操作,那么另一种方法是在进行聚合之前 预先计算不同区域中的多个本地时间并将它们与文档一起保存。不过这会变得很乱。
标签: mongodb timezone mongoid aggregation-framework