2016-04-20 56 views
1

我轉換此日期格式蒙戈轉換ISO日期成怪異串

「日期」: 「2016年2月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") 

我該怎麼做才能把它變成真正的日期?

回答

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); 
} 

這會快得多,也安全「唯一」更新數據的"date"財產,而不會影響其他併發寫操作。