我有一个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脚本?
答案 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)
它会在几秒钟内运行。