mongodb - 将数据类型从字符串更改为日期,同时跳过丢失的数据
问题描述
我的数据库中的核心集合(数据库中的其他集合参考这个集合)包含 3 个带有日期信息的字段,此时这些字段被格式化为字符串,如MM/DD/YYYY。此外,还有一系列文档,该字段包含缺失数据,即""。mongoimport
我通过在 JSON 文件上运行命令来填充此集合。
我的目标是将这些日期字段转换为实际的ISODate
数据类型,以便允许按日期过滤集合。此外,我希望 MongoDB 知道空字符串表示缺失值。我对此进行了广泛阅读,导致我尝试了很多事情:
- 尝试
forEach
声明 - 这有效,但仅适用于第一个文档。
db.collection.find().forEach(function(element){
element.startDate = ISODate(element.startDate);
db.collection.save(element);
})
- 使用一种 for 循环:效果很好,但是一旦遇到缺失值就停止了(因此它转换了大约 11 个值):
db.collection.update(
{
"startDate":{
"$type":"string"
}
},
[
{
"$set":{
"startDate":{
"$dateFromString":{
"dateString":"$startDate",
"format":"%m/%d/%Y"
}
}
}
}
]
)
所以,这两种方法都起作用了——但我不知道如何将它们应用到整个集合中。此外,我有兴趣以最有效的方式执行此任务。但是,我只想这样做一次 - 将来添加的数据应该希望在导入阶段正确格式化。
解决方案
db.collection.updateMany(
{
"$and": [
{ "startDate": { "$type": "string" } },
{ "startDate": { "$ne": "" } }
]
},
[
{
"$set": {
"startDate": {
"$dateFromString": {
"dateString": "$startDate",
"format": "%m/%d/%Y"
}
}
}
}
]
)
过滤掉空字符串而不是进行转换将忽略日期字段中具有空字符串的文档。
推荐阅读
- angular - Angular:无法通过路由器传递对象?
- python - requests.get 在某些 url 上崩溃
- asp.net-mvc - 由于请求正文过大,大文件上传到 ASP.NET Core 3.0 Web API 失败
- image - 如何在 Dialogflow 中为 Twilio 创建包含丰富消息的响应?
- rust - tokio TcpStream 上的并发读/写
- wso2 - WSO2 商店无法登录具有内部/订阅者权限的新用户
- c# - 如何让每个士兵根据士兵指数轮换?
- r - R - ggplot2 - 当 x 轴是因子变量时,如果 geom_errorbar 超出限制,则添加箭头
- flutter - 如何正确聚焦基于焦点节点的 hasFocus 值有条件地创建的文本字段?
- json - 如何使用正则表达式匹配文档的第一个左大括号