1

我有一个包含三亿个文档的集合。每个文档都有一个“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 脚本对我来说也是可行的。

顺便说一句,这个集合没有被索引,因为它不断地插入文档

4

1 回答 1

2

使用mongo 批量更新,您可以将日期更改为 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(); 
于 2015-05-26T10:13:13.840 回答