MongoDB中所有文档修改字段时间格式的高效方法
Efficient way to modify the time format of a field for all documents in MongoDB
我有一个包含三亿个文档的集合。
每个文档都有一个 "created_at" 字段,以这样的字符串格式指定时间
'Thu Feb 05 09:25:38 +0000 2015'
我想将所有 "created_at" 字段更改为 MongoDB 支持的时间格式。
所以我写了一个简单的Ruby脚本:
collection.find.each do |document|
document[:created_at] = Time.parse document[:created_at]
collection.save(document)
end
确实如我所愿改变了时间格式,但是我的脚本已经运行50个小时了,没有完成的迹象。
有没有更好的方法来完成这个任务?
MongoDB shell 脚本或 Python 脚本对我来说也是可行的。
顺便说一下,这个集合没有索引,因为它不断插入文档
使用 mongo bulk update 您可以将日期更改为 ISODATE 格式,如下所示:
var bulk = db.collectionName.initializeOrderedBulkOp();
var counter = 0;
db.collectionName.find().forEach(function(data) {
var updoc = {
"$set": {}
};
var myKey = "created_at";
updoc["$set"][myKey] = new Date(Date.parse(data.created_at));
// queue the update
bulk.find({
"_id": data._id
}).update(updoc);
counter++;
// Drain and re-initialize every 1000 update statements
if(counter % 1000 == 0) {
bulk.execute();
bulk = db.collectionName.initializeOrderedBulkOp();
}
})
// Add the rest in the queue
if(counter % 1000 != 0) bulk.execute();
我有一个包含三亿个文档的集合。 每个文档都有一个 "created_at" 字段,以这样的字符串格式指定时间 'Thu Feb 05 09:25:38 +0000 2015'
我想将所有 "created_at" 字段更改为 MongoDB 支持的时间格式。 所以我写了一个简单的Ruby脚本:
collection.find.each do |document|
document[:created_at] = Time.parse document[:created_at]
collection.save(document)
end
确实如我所愿改变了时间格式,但是我的脚本已经运行50个小时了,没有完成的迹象。
有没有更好的方法来完成这个任务? MongoDB shell 脚本或 Python 脚本对我来说也是可行的。
顺便说一下,这个集合没有索引,因为它不断插入文档
使用 mongo bulk update 您可以将日期更改为 ISODATE 格式,如下所示:
var bulk = db.collectionName.initializeOrderedBulkOp();
var counter = 0;
db.collectionName.find().forEach(function(data) {
var updoc = {
"$set": {}
};
var myKey = "created_at";
updoc["$set"][myKey] = new Date(Date.parse(data.created_at));
// queue the update
bulk.find({
"_id": data._id
}).update(updoc);
counter++;
// Drain and re-initialize every 1000 update statements
if(counter % 1000 == 0) {
bulk.execute();
bulk = db.collectionName.initializeOrderedBulkOp();
}
})
// Add the rest in the queue
if(counter % 1000 != 0) bulk.execute();