2011-12-01 27 views
0

我打算迁移旧数据库字段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 

麻烦的是它与蒙戈和红宝石占80%和20%的CPU速度极慢分别。

对于比较简单的迁移,我能够使用蒙戈更新,像这样:

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

这跑速度极快。有没有办法将上面的rake任务转换成mongo更新或shell脚本?

+0

如果您想要轻松地使用Ruby和port编写js mongo,请从调试器中获取mongo命令(如果您设置为调试级别)。 – jcollum

回答

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) 

它运行在几秒钟内。