Группировать по часам и считать MongoDB - PullRequest
0 голосов
/ 04 октября 2018

Я работаю над проектом с сервисом обмена велосипедами.Каждая поездка имеет следующую информацию

> db.bikes.find({bike:9990}).pretty()
{
    "_id" : ObjectId("5bb59fd8e9fb374bf0cd5c1c"),
    "gender" : "M",
    "userAge" : 49,
    "bike" : 9990,
    "depStation" : 150,
    "depDate" : "01/08/2018",
    "depHour" : "0:00:13",
    "arrvStation" : 179,
    "arrvDate" : "01/08/2018",
    "arrvHour" : "0:23:38"
}

Как мне группировать по каждому часу дня и подсчитывать количество поездок, совершенных в этот конкретный час?Я пытаюсь с этим запросом

db.bikes.aggregate(
  { 
     $group:{_id:{$hour: "$depHour"}, trips:{$sum: 1}}
  }
)

Но он выдает эту ошибку

    "ok" : 0,
    "errmsg" : "can't convert from BSON type string to Date",
    "code" : 16006,
    "codeName" : "Location16006"

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вы можете попробовать агрегацию ниже с помощью mognodb 4.0

db.collection.aggregate([
  { "$group": {
    "_id": {
      "$dateToString": {
        "date": {
          "$toDate": { "$concat": ["$depDate", "T", "$depHour"] }
        },
        "format": "%Y-%m-%d-%H"
      }
    },
    "trips": { "$sum": 1 }
  }}
])
0 голосов
/ 04 октября 2018

Поля depDate и depHour являются строковыми значениями, которые обозначают день и час соответственно, поэтому нет необходимости использовать операторы date для преобразования полей в объекты даты, все что вам нужнонужно извлечь часть часа, используя $substrCP, а затем использовать их непосредственно как выражения в вашем $group _id как:

db.bikes.aggregate([
    { '$group': {
        '_id': {
            'day': '$depDate',
            'hour': { '$substrCP': [ '$depHour', 0, 2 ] }
        }, 
        'trips': { '$sum': 1 }
    } }
])
...