Получить наибольшее значение за час в MongoDB для данного диапазона дат? - PullRequest
1 голос
/ 03 июня 2019

У меня есть следующая структура документа в 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
}

Где итоговая сумма - это максимальная почасовая сумма за данный конкретный день.

Запрос, который я пробовал, выглядит следующим образом:

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

1 Ответ

1 голос
/ 03 июня 2019

Пожалуйста, попробуйте ниже

рабочая площадка ссылка

// Array

[
  {
    "_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")
  }
]

// Script

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
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...