获得mongo的第一天。将'yyyy-mm-dd-hh-mm-ss.SSS'转换为'yyyy-mm-01-00-00-00.000'的时间戳

时间:2016-09-01 17:24:59

标签: mongodb date timestamp mongodb-query aggregation-framework

[
  {
    "rating": 4,
    "createdAt": ISODate("2016-08-08T15:32:41.262+0000")
  },
  {
    "rating": 4,
    "createdAt": ISODate("2016-08-08T15:32:41.262+0000")
  },
  {
    "rating": 3,
    "createdAt": ISODate("2016-07-01T15:32:41.262+0000")
  },
  {
    "rating": 5,
    "createdAt": ISODate("2016-07-01T15:32:41.262+0000")
  }
]

这是我的数据集。

我用它来获取月份数。

[
    { 
        "$project": {
            "createdAtMonth": { "$month": "$createdAt" },
            "rating": 1
        }
    },
    {
         "$group": {
             "_id": "$createdAtMonth",
             "average": { "$avg": "$rating" },
             "month": { "$first": "$createdAtMonth" }
         }
    }
]

我需要在时间戳中获取该月的开始日期。我怎么能这样做?

预期产出:

[{
    "_id": 8,
    "average": 4,
    "month": 8,
    "time": 1469989800000
}, {
    "_id": 7,
    "average": 4,
    "month": 7,
    "time": 1467311400000
}]

此输出中的日期可能不正确。但根据输入,我应该得到两个对象,一个用于七月,一个用于八月

1 个答案:

答案 0 :(得分:1)

实现它的一种方法是将任务分成2个子任务

  1. yyyy-mm-dd-hh-mm-ss.SSS的时间戳转换为yyyy-mm-dd-00-00-00.000的时间戳。这可以使用$mod 算术聚合运算符来完成。
  2. yyyy-mm-dd-00-00-00.000的时间戳转换为yyyy-mm-01-00-00-00.000的时间戳。这可以通过从(dd - 1) * 24 * 60 * 60 * 1000
  3. 的时间戳中减去yyyy-mm-dd-00-00-00.000来完成

    汇总管道

    [
      {
        $project:
          {
            "createdAtMonth": { $month: "$createdAt" },
            "createdAt": 1,
            "rating": 1
          }
      },
      {
        $group:
          {
            "_id": "$createdAtMonth",
            "createdAt": { $first: "$createdAt" },
            "average": { "$avg": "$rating" }
          }
      },
      {
        $project:
          {
            "_id": 0,
            "month": "$_id",
            "average": 1,
            "DD_1": { $subtract: [ { $dayOfMonth: "$createdAt" }, 1 ] },
            "t_stamp": { $subtract: [ "$createdAt", new Date("1970-01-01") ] }
          }
      },
      {
        $project:
          {
            "month": 1,
            "average": 1,
            "time":
              {
                $subtract:
                  [
                    { $subtract: [ "$t_stamp", { $mod: [ "$t_stamp", 24 * 60 * 60 * 1000 ] } ] },
                    { $multiply: [ "$DD_1", 24 * 60 * 60 * 1000 ] }
                  ]
              }
          }
      }
    ]
    

    <强>示例

    { "_id": 1, "rating": 4, "createdAt": ISODate("2016-08-08T15:32:41.262Z") }
    { "_id": 2, "rating": 3, "createdAt": ISODate("2016-08-08T15:32:41.262Z") }
    { "_id": 3, "rating": 3, "createdAt": ISODate("2016-07-01T15:32:41.262Z") }
    { "_id": 4, "rating": 5, "createdAt": ISODate("2016-07-01T15:32:41.262Z") }
    

    <强>结果

    { "average": 4, "month": 7, "time": 1467331200000 }
    { "average": 3.5, "month": 8, "time": 1470009600000 }
    

    您可以使用在线Epoch & Unix Timestamp convertor来验证

      

    1467331200000是星期五,01 Jul 2016 00:00:00 GMT的时间戳

         

    1470009600000是Mon的时间戳,2016年8月1日00:00:00 GMT