繁体   English   中英

MongoDB 聚合框架 - 按年分组

[英]MongoDB Aggregate Framework - Group by Year

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

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
}

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

任何建议表示赞赏!

已知某些版本的 Windows 可以运行。 有没有机会,您使用的是 32 位操作系统? 有问题的代码在这里,并且取决于gmtime_s()实现。

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

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

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

  • 删除具有最短日期的行(通过匹配/过滤器)
  • 通过某个日期(大于x日期)过滤

然后聚合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM