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

时间:2016-04-20 21:37:37

标签: javascript mongodb mongodb-query

我转换了这种日期格式

  

“date”:“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);})

Mongo给了我这个:

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

我该怎么做才能把它变成真正的日期?

1 个答案:

答案 0 :(得分:1)

日期字符串无效,但转换次数较少。基本上你只需要在“日期”部分和“时间”部分之间"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);
 }

哪个会更快,也更安全“only”更新数据的"date"属性,而不会影响其他并发写操作。