我的DB中的核心集合(DB中的其他集合参考此集合)包含3个字段,日期此时格式化为字符串的信息,如MM/DD/YYYY. 此外,该字段包含缺失数据的文档范围,即">. 我通过在JSON文件上运行mongoimport
命令来填充这个集合。
我的目标是将这些日期字段转换为实际的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"
}
}
}
}
]
)
过滤掉空字符串而不是进行转换将忽略日期字段中有空字符串的文档。