对于给定的日期范围,在MongoDB中按小时获取最高值?

对于给定的日期范围,在MongoDB中按小时获取最高值?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我在MongoDB中有以下文档结构: { "_id" : ObjectId("5c1b7451b1829b69963029ea"), "duration" : 92, "accountId" : ObjectId("9aafe7b01cf4560c9bb5d68"), "createdAt" : ISODate("2018-12-20T10:52:01.560Z"), "__v" : 0, }, { "_id" : ObjectId("5c1b74

我在MongoDB中有以下文档结构:

{
    "_id" : ObjectId("5c1b7451b1829b69963029ea"),
    "duration" : 92,
    "accountId" : ObjectId("9aafe7b01cf4560c9bb5d68"),
    "createdAt" : ISODate("2018-12-20T10:52:01.560Z"),
    "__v" : 0,
},
{
    "_id" : ObjectId("5c1b7451b1829b69963029ea"),
    "duration" : 192,
    "accountId" : ObjectId("9aafe7b01cf4560c9bb5d68"),
    "createdAt" : ISODate("2018-12-20T11:52:01.560Z"),
    "__v" : 0,
}
现在我想得到一天中持续时间的最高总和,以及相应的小时数。从技术上讲,是这样的:

{
    "readableDate" : "2018-12-20",
    "hour" : 11,
    "total" : 192
}
其中total是特定日期的最高小时总数

我尝试的查询如下:

db.getCollection('operational_details').aggregate(


            {"$match": {"accountId": ObjectId("9aafe7b01cf4560c9bb5d68"),
                            "createdAt": {"$gte": ISODate("2019-06-01T10:30:29.725Z"),
                                          "$lte": ISODate("2019-06-04T10:30:29.725Z")},
                            }},
     { "$project": {
          "date": {"$dateToString": {"format": "%Y-%m-%d", "date": "$createdAt"}}, 
          "hour": {"$hour":"$createdAt"},
         "total":{"$sum": "$duration"} }
     },
     { "$group":{ 
           "_id": { "hour":"$hour","date":"$date"},
           "max": {"$max": "$total"}
       }})
希望我清楚我的例子。TIA

请尝试以下选项

工作场地

//排列

[
  {
    "_id": ObjectId("5cf4f20243f560e1e0a77014"),
    "duration": 92,
    "accountId": ObjectId("6ef4f20243f560e1e0a77015"),
    "createdAt": ISODate("2018-12-20T10:52:10.320Z")
  },
  {
    "_id": ObjectId("5cf4f21843f560e1e0a7701a"),
    "duration": 192,
    "accountId": ObjectId("6ef4f20243f560e1e0a77015"),
    "createdAt": ISODate("2018-12-20T11:52:11.123Z")
  }
]
//剧本

db.collection.aggregate([
  {
    "$match": {
      "accountId": {
        $eq: ObjectId("6ef4f20243f560e1e0a77015")
      },
      "createdAt": {
        $gte: ISODate("2018-12-19T10:30:00.000Z"),
        $lte: ISODate("2018-12-21T10:30:00.000Z")
      }
    }
  },
  {
    "$project": {
      "date": {
        "$dateToString": {
          "format": "%Y-%m-%d",
          "date": "$createdAt"
        }
      },
      "hour": {
        "$hour": "$createdAt"
      },
      "duration": "$duration"
    }
  },
  {
    "$group": {
      "_id": {
        "hour": "$hour",
        "date": "$date"
      },
      "total": {
        "$sum": "$duration"
      }
    }
  },
  {
    "$project": {
      "readableDate": "$_id.date",
      "hour": "$_id.hour",
      "total": "$total"
    }
  },
  {
    "$project": {
      "_id": 0
    }
  },
  {
    "$sort": {
      "total": -1
    }
  },
  {
    "$limit": 1
  }
])
//结果

[
  {
    "hour": 11,
    "readableDate": "2018-12-20",
    "total": 192
  }
]

我尝试了同样的方法,但我得到了以下格式的答案:``{u id:{“hour”:1,“date”:“2019-06-02”},“readableDate”:“2019-06-02”,“hour”:1,“total”:934}{“hour”:10,“date”:“2019-06-03”},“readableDate”:“2019-06-03”,“hour”:10,“total”:98},{“\u id”:{“hour”:11,“date”:“2019-06-02”},“readableDate”:“2019-06-02”,“hour”:11,“total”:282}``不同于我在O/PThanks中想要的努力Ratan,但您更新的查询现在返回空值:(好的,如果我不清楚我想要的O/P类型,我很抱歉。我想要一天中最高持续时间与小时的总和。请再次查看问题。而不是同一天的多小时值。我感谢你的时间Ratan,但我需要一天的最大值,比如上午10-11点的总持续时间是115,下午12-13点的总持续时间是115假设日期为2019年6月1日,持续时间为119。在这种情况下,我希望输出为{“hour”:13,“readableDate”:“2019-06-01”,“total”:119},而不是该特定日期的任何其他值。我已更新了我的答案。请批准我的答案,如果您喜欢我的努力,请批准我的答案。