MongoDB聚合框架 - 按年分组

时间:2012-12-16 17:24:50

标签: javascript mongodb

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

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
}

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

任何建议表示赞赏!

2 个答案:

答案 0 :(得分:1)

已知某些版本的Windows可以正常运行。你有没有机会使用32位操作系统?相关代码为here,具体取决于gmtime_s()实施。

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

答案 1 :(得分:0)

此问题是由于汇总时未正确处理最短日期引起的。

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

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

然后汇总。