蒙戈将ISO日期转换为奇怪的字符串

Mongo converting ISO date into weird string

本文关键字:字符串 转换 ISO 日期      更新时间:2023-09-26

我转换了这个日期格式

"日期" : "2016-02-22 13:52:23"

使用此代码

db.gmastats.find({date: {$not: {$type: 9}}}).forEach(function(doc) {doc.date = new Date(doc.date); db.gmastats.save(doc);})

蒙戈给了我这个:

 ISODate("-292275055-05-16T16:47:03.192Z")

我该怎么做才能把它变成一个真正的约会?

日期字符串无效,但只需少量转换即可。基本上,您只需要在"日期"部分和"时间"部分之间"T",然后new Date()就可以解决了。

 db.gmastats.find({ "date": { "$type": 2 } }).forEach(function(doc) {
    doc.date = new Date(doc.date.split(" ").join("T")); 
    db.gmastats.save(doc);
 })

还要注意的是,只寻找不是BSON日期的东西是不安全的。当您对"字符串"进行操作时,您应该查看"字符串"数据。

但实际上,您"应该"使用"批量"操作执行此操作:

 var ops = [];
 db.gmastats.find({ "date": { "$type": 2 } }).forEach(function(doc) {
    ops.push({ "updateOne": { 
        "filter": { "_id": doc._id },
        "update": { "$set": { "date": new Date(doc.date.split(" ").join("T")) } }
    }});
    if ( ops.length == 1000 ) {
       db.gmastats.bulk_write(ops);
       ops = []
    }
 })
 if ( ops.length > 0 ) {
     db.gmastats.bulk_write(ops);
 }

这将更快,并且安全地"仅"更新数据的"date"属性,而不会影响其他并发写入操作。