对于给定的日期范围,在MongoDB中按小时获取最高值?
我在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
{
"_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},而不是该特定日期的任何其他值。我已更新了我的答案。请批准我的答案,如果您喜欢我的努力,请批准我的答案。