首页 > 解决方案 > MongoDB - 将字符串转换为时间戳,按小时分组

问题描述

我将以下文档存储在集合中:

{
  "REQUESTTIMESTAMP" : "26-JUN-19 01.34.10.095000000 AM",
  "UNHANDLED_INTENT" : 0,
  "USERID" : "John",
  "START_OF_INTENT_SKILL_CONVERSATION" : 0,
  "PROPERTYCODE" : ""
}  

我想按小时分组(我们将从'REQUESTTIMESTAMP'获得)

早些时候,我以不同的方式将此文档存储在集合中,其中我有一个单独的小时字段,并使用该小时字段进行分组:

以前的聚合查询:

collection.aggregate([
    {'$match': query}, {
        '$group': {
            "_id": {
                "hour": "$hour",
                "sessionId": "$sessionId"
            }
        }
    }, {
        "$group": {
            "_id": "$_id.hour",
            "count": {
                "$sum": 1
            }
        }
    }
])    

以前的集合结构:

{
  "timestamp" : "1581533210921",
  "date" : "12-02-2020",
  "hour" : "13",
  "month" : "02",
  "time" : "13:46:50",
  "weekDay" : "Wednesday",
  "__v" : 0
}

如何使用新文档结构执行上述相同的先前聚合查询(从“ REQUESTTIMESTAMP ”字段中提取小时数后?)

标签: mongodbmongodb-queryaggregation-framework

解决方案


如果您无法使用实际日期字段更新数据库并且仍想继续使用现有格式,请尝试此查询,它将添加从给定字符串字段REQUESTTIMESTAMP中提取的小时字段:

询问 :

db.collection.aggregate([
    {
        $addFields: {
            hour: {
                $let: {
                    /** split string into three parts date + hours + AM/PM */
                    vars: { hour: { $slice: [{ $split: ["$REQUESTTIMESTAMP", " "] }, 1, 2] } },
                    in: {
                        $cond: [{ $in: ["AM", "$$hour"] }, // Check AM exists in array
                        { $toInt: { $substr: [{ $arrayElemAt: ["$$hour", 0] }, 0, 2] } }, // If yes then return int of first 2 letters of first element in hour array
                        { $add: [{ $toInt: { $substr: [{ $arrayElemAt: ["$$hour", 0] }, 0, 2] } }, 12] } ] // If PM add 12 to int of first 2 letters of first element in hour array
                    }
                }
            }
        }
    }
])

测试: MongoDB-游乐场


推荐阅读