使用类似rake的任务迁移mongo数据

时间:2011-12-01 18:29:55

标签: ruby-on-rails ruby mongodb mongoid

我有一个rake任务,旨在将旧数据库字段迁移到Hash

task :degrees => :environment do
  Person.all.each do |p|
    if p['degree1'] || p['degree2']
      p.degrees = {}
      p.degrees["first"] = p['degree1'] == "Other" ? p['degree1_other'] : p['degree1'] 
      p.degrees["second"] = p['degree2'] == "Other" ? p['degree2_other'] : p['degree2']
      p.save
    end
  end
end

麻烦是mongo和ruby分别占用80%和20%的CPU时非常慢。

对于更简单的迁移,我能够像这样使用mongo更新:

db.people.update({},{$rename : {"url" : "website"}}, false, true)

这跑得非常快。有没有办法将上面的rake任务转换为mongo更新或shell脚本?

1 个答案:

答案 0 :(得分:0)

我创建了一个shell script

db.people.update({degree1:"Other"}, { $rename : { "degree1_other" : "degree1" } }, false, true )
db.people.update({degree2:"Other"}, { $rename : { "degree2_other" : "degree2" } }, false, true )
db.people.update({degree3:"Other"}, { $rename : { "degree3_other" : "degree3" } }, false, true )

db.people.find({degrees:null}).forEach( function (doc) {
    doc.degrees = { "first" : doc.degree1, "second" : doc.degree2, "third" : doc.degree3 };
    db.people.save(doc);
});

db.people.update({degree1: {$exists : true}},{$unset:{degree1:1}},false,true)
db.people.update({degree1_other: {$exists : true}},{$unset:{degree1_other:1}},false,true)
db.people.update({degree2: {$exists : true}},{$unset:{degree2:2}},false,true)
db.people.update({degree2_other: {$exists : true}},{$unset:{degree2_other:2}},false,true)
db.people.update({degree3: {$exists : true}},{$unset:{degree3:3}},false,true)
db.people.update({degree3_other: {$exists : true}},{$unset:{degree3_other:3}},false,true)

它会在几秒钟内运行。