按MongoDB中的计算日期分组

时间:2018-03-21 15:35:19

标签: mongodb aggregation-framework

我的数据如下:

[
  {
    "start_time" : ISODate("2017-08-22T19:43:41.442Z"), 
    "end_time" : ISODate("2017-08-22T19:44:22.150Z")
  },
  {
    "start_time" : ISODate("2017-08-22T19:44:08.344Z"),
    "end_time" : ISODate("2017-08-22T19:46:25.500Z") 
  }
]

有没有办法运行聚合查询,它会给我一个频率结果,如:

{ 
   ISODate("2017-08-22T19:43:00.000Z"): 1,
   ISODate("2017-08-22T19:44:00.000Z"): 2,
   ISODate("2017-08-22T19:45:00.000Z"): 1,
   ISODate("2017-08-22T19:46:00.000Z"): 1
}

基本上我想按分钟分组,总结一下,但诀窍是每条记录可能会计入多个组。此外,与19:45的情况一样,数据中未明确提及日期(计算为在两个其他日期之间)。

起初我以为我可以用$ minute这样的功能来做到这一点。我可以按分钟分组并检查数据是否适合该范围。但是,如果可能的话,我会坚持如何实现。我不确定如何将单个条目转换为多个日期组。

1 个答案:

答案 0 :(得分:2)

您可以在3.6 mongo版本中使用以下聚合。

db.col.aggregate([
  {"$addFields":{"date":["$start_time","$end_time"]}},
  {"$unwind":"$date"},
  {"$group":{
    "_id":{
      "year":{"$year":"$date"},
      "month":{"$month":"$date"},
      "day":{"$dayOfMonth":"$date"},
      "hour":{"$hour":"$date"},
      "minute":{"$minute":"$date"}
    },
    "count":{"$sum":1}
  }},
  {"$addFields":{
    "_id":{
      "$dateFromParts":{
        "year":"$_id.year",
        "month":"$_id.month",
        "day":"$_id.day",
        "minute":"$_id.minute"
      }
    }
  }}
])