Oké ik heb het gehaald. Ik denk dat er een snellere manier is om de mongo-console te gebruiken met zoiets als dit:MongoDB:Hoe verander ik het type van een veld?
Maar ik kreeg de conversie niet werkend, dus koos ik voor deze langzamere methode in de railsconsole met meer downtime. Als iemand een snellere oplossing heeft, post die dan.
- maak een nieuw Integer-veld met een nieuwe naam, zeg
amount2
- converteer elk
amount
naar de juiste waarde vooramount2
in een console- of rake-taak
Mongoid.identity_map_enabled = false
Transaction.all.each_with_index do |t,i|
puts i if i%1000==0
t.amount2 = t.amount.to_money
break if !t.save
end
Merk op dat .all.each goed werkt (je hoeft .find_each of .find_in_batches niet te gebruiken zoals gewone activerecord met mysql) vanwege mongodb-cursors. Het zal het geheugen niet vullen zolang de identity_map is uitgeschakeld.
-
haal de site uit de lucht voor onderhoud, voer de migratie nog een keer uit om de hoeveelheid velden vast te leggen die in de afgelopen minuten zouden kunnen zijn gewijzigd (zoiets als
Transaction.where(:updated_at.gt => 1.hour.ago).each_with_index...
-
commentaar uit
field :amount, type: BigDecimal
in uw model wilt u niet meer dat mongoid dit veld weet, en druk op deze code - voer nu een ander script uit om uw kolom te hernoemen (het overschrijft alle oude BigDecimal-tekenreekswaarden in het proces). Mogelijk moet u commentaar geven op eventuele validaties die u op het model heeft en die het oude veld verwachten.
Mongoid.identity_map_enabled = false
Transaction.all.each_with_index do |t,i|
puts i if i%1000==0
t.rename :amount2, :amount
end
Dit is atomair en vereist geen opslag op het model.
- werk uw model bij zodat het het nieuwe kolomtype
field :amount, type: Integer
weergeeft - implementeer en breng de site terug
Zoals gezegd denk ik dat er een betere manier is, dus als iemand tips heeft, deel deze dan. Bedankt!