按小时分组并计算MongoDB

时间:2018-10-04 05:57:46

标签: mongodb nosql mongodb-query aggregation-framework

我在一个项目中处理自行车共享服务的数据。每次旅行都有以下信息

> 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 :(得分:2)

depDatedepHour字段都是分别表示日期和小时的字符串值,因此无需使用date operators将字段转换为日期对象,所有您需要使用 $substrCP 提取小时部分,然后将其直接用作$group _id中的表达式,如下所示:

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

答案 1 :(得分:1)

您可以尝试使用mognodb 4.0

进行以下聚合
db.collection.aggregate([
  { "$group": {
    "_id": {
      "$dateToString": {
        "date": {
          "$toDate": { "$concat": ["$depDate", "T", "$depHour"] }
        },
        "format": "%Y-%m-%d-%H"
      }
    },
    "trips": { "$sum": 1 }
  }}
])