我转换了这种日期格式
“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")
我该怎么做才能把它变成真正的日期?
答案 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"
属性,而不会影响其他并发写操作。