MongoDB如何筛选同一字段Date()值以便转换为ISODate()
问题说明
原有日期字段Schema定义:
startDate: {type: Date, default: Date.now},
集合内该字段存在两类值:
- 标准BSON日期类型:
ISODate("2022-05-31T03:23:32.193-06:30") - 异常值:
Date(29906992800000)
需求为筛选所有Date(...)格式的异常值,后续通过Node应用将其转换为标准ISODate格式。
已完成验证
- 普通字段查询
执行命令:
db.<collection>.find({_id:<id>}, {_id:0, <field>:1})
返回结果:
{"startDate": Date("29906992800000") }
- 字段类型检测
执行聚合查询检测字段类型:
db.<collection>.aggregate([ {$match:{_id:<id>}}, {$project:{_id:0, t:{$type:"<field>"}}} ])
返回结果确认该类异常值的存储类型为字符串:
{"t": "string"}
筛选实现方案
由于异常值为字符串类型,且格式固定为Date(毫秒时间戳数字),直接组合类型判断和正则匹配即可精准筛选,查询语句如下:
db.<collection>.find({ startDate: { $type: "string", $regex: /^Date\(\d+\)$/ } })
查询包含两层校验逻辑:
- 校验
startDate值类型为字符串,自动过滤所有正常的ISODate类型文档 - 正则校验字符串完全匹配
Date(纯数字)格式,不会误命中其他字符串内容
查询返回的结果集就是所有需要转换的异常文档,可直接拉取到Node应用中做后续转换处理。
内容的提问来源于stack exchange,提问作者Prabhakaran
相关产品推荐
相关产品推荐

