【问题标题】:MongoDB Aggregate Framework - Group by YearMongoDB 聚合框架 - 按年份分组
【发布时间】:2012-12-16 17:24:49
【问题描述】:

我一直在尝试使用聚合函数按年份对日期字段进行分组:

db.identities.aggregate([
{
    $group : {
        _id : { year : {$year : "$birth_date"}},
        total : {$sum : 1}
        }
    }   
])

然而,我的一些日期在 1970 年之前,作为 Windows 用户,我收到了一个关于 gmtime 的严重错误:

{
    "errmsg" : "exception: gmtime failed - your system doesn't support dates before 1970",
    "code" : 16422,
    "ok" : 0
}

我知道现在显而易见的答案是让我运行虚拟机或其他东西,但我只是好奇是否有任何适用于 Windows 的解决方法(在我的情况下是 Windows 7)。如果没有多少性能损失会将日期存储为嵌套对象,即:

birth_date : {
  year : 1980,
  month : 12,
  day : 9
}

我不太确定索引等会有多忙碌。

任何建议表示赞赏!

【问题讨论】:

  • 你用的是什么版本的 Mongo?

标签: javascript mongodb


【解决方案1】:

已知某些版本的 Windows 可以正常工作。无论如何,您使用的是 32 位操作系统吗?有问题的代码是here,取决于gmtime_s() 的实现。

如果此集合只是用于聚合查询,您当然可以将日期组件存储在对象中。我建议缩写字段名称(例如ymd)以节省存储空间,因为字段字符串存在于每个存储的文档中。这里的权衡是不能使用任何聚合日期运算符。您可能希望将时间戳存储为有符号整数(例如ts),以便在必要时轻松进行范围查询。

【讨论】:

  • 对长时间的延迟表示歉意 - 只是重新访问了这个。感谢您的回答!
  • 这有点邪恶,因为它确实严重削弱了该平台上的date type 实现。这也发生在 64 位版本上:stackoverflow.com/q/21869602/2313887
  • @NeilLunn:我注意到您在另一个问题中的评论,并打开了SERVER-12816 来跟踪。
  • 我发现这已经是 3 年的问题了,而且只被认为是一种改进,这令人沮丧。在 Windows Server 2012 R2 上的 v3.0.3 中,它仍然无法正常工作。
【解决方案2】:

这个问题是由于聚合时没有很好地处理最小日期造成的。

一种快速的解决方法(如果可能)是通过 ff: 过滤日期:

  • 删除日期最短的行(通过匹配/过滤器)
  • 过滤特定日期(大于 x 日期)

然后聚合。

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2013-01-12
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多