日期字符串無效,但轉換率很小。基本上你只需要在「日期」部分和「時間」部分之間使用"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"
財產,而不會影響其他併發寫操作。