mongodb - 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 ”字段中提取小时数后?)
解决方案
如果您无法使用实际日期字段更新数据库并且仍想继续使用现有格式,请尝试此查询,它将添加从给定字符串字段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-游乐场
推荐阅读
- reactjs - 成功登录后导航到不同的页面
- nginx - 用于 nginx 的 kubernetes 持久卷未显示默认 index.html 文件
- android - 从 Firebasedatabase 检索数据并设置到 recyclierview 适配器
- python - 如何安装张量流?
- redis - 如何使用 NX 选项设置值并使用 ServiceStack.Redis 过期?
- influxdb - InfluxDB 在查询特定日期时返回空结果集
- wpf - WPF - 在 MVVM 中添加 CRUD 操作的位置
- sinch - Android Studio 中的 Sinch 电话会议
- kotlin - 如何在 AutoCompleteTextView 项目建议中添加刻度符号?
- r - 将具有字符向量作为列的数据帧转换为长格式