在MongoDB中按CET时间分组

时间:2017-02-25 00:11:17

标签: mongodb aggregation-framework

我正在尝试聚合mongodb中的数据,按用户分组和CET时间我的文档。根据文档,我尝试了以下内容:

    db.WORKING_HOURS.aggregate(
   [
      {
        $group : {
           _id : { user : "$user", date : { $add: [ "$heure", 60*60000 ] }},
           nombre: { $sum : 1 }
        }
      }
   ]
)

我的数据有以下形式:

{
    "_id" : ObjectId("58b0b2bf32d3cd188cea9e1a"),
    "user" : 1,
    "heure" : ISODate("2017-02-24T22:25:03.180Z")
}

我无法正确汇总数据。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

问题是我试图按日期分组,但时间不断变化,所以通常情况下,不可能对我的值进行分组,这也解释了为什么我要添加多个组。

要解决此问题,我使用$ dayOfWeek运算符(从日期开始)

结果:

[
  {
    $group : {
       _id : {user : "$user", jour : {$dayOfYear : { $add: [ "$heure", 1000*60*60 ] }}},
       nombre: { $sum : 1 }
    }
  }

答案 1 :(得分:0)

你的答案有几个问题。

您还没有将日光节省考虑在内 因为CET使用UTC + 1(标准时间)和UTC + 2(夏令时)。

$dayOfYear会将多年的同一天值组合在一起。

你可以尝试下面的事情。

您可以将日期分为服务器时间并转换为CET时区,然后再将其呈现给用户。

在数据库中添加日期时,其他替代方法是添加偏移量。

像这样。

{
    "date": ISODate("2017-02-24T00:00:00Z"),
    "offsetmillis": 3600000
} 
{
    "date": ISODate("2017-03-27T00:00:00Z"),
    "offsetmillis": 7200000
} 

您可以使用以下聚合按日期分组。

{
  $group: {
    _id: {
      date: {$dayOfMonth: {$add: ["$date", "$offsetmillis"]}},
      month: {$month: {$add: ["$date", "$offsetmillis"]}},
      year: {$year: {$add: ["$date", "$offsetmillis"]}}
    },
      count: {$sum: 1}
  }
}