Ok, jeg klarede det. Jeg tror, der er en hurtigere måde at bruge mongo-konsollen med noget som dette:MongoDB:Hvordan ændrer man typen af et felt?
Men jeg kunne ikke få konverteringen til at virke, så jeg valgte denne langsommere metode i skinnekonsollen med mere nedetid. Hvis nogen har en hurtigere løsning, så send den venligst.
- opret et nyt heltalsfelt med et nyt navn, sig
amount2
- konverter hvert
amount
til den rigtige værdi foramount2
i en konsol- eller rake-opgave
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
Bemærk, at .all.each fungerer fint (du behøver ikke at bruge .find_each eller .find_in_batches som almindelig activerecord med mysql) på grund af mongodb-markører. Det fylder ikke hukommelsen, så længe identity_map er slået fra.
-
fjern siden til vedligeholdelse, kør migreringen en gang til for at fange ethvert beløbsfelt, der kunne have ændret sig i de sidste par minutter (noget som
Transaction.where(:updated_at.gt => 1.hour.ago).each_with_index...
-
kommentere
field :amount, type: BigDecimal
i din model ønsker du ikke at mongoid skal vide mere om dette felt, og tryk på denne kode - kør nu et andet script for at omdøbe din kolonne (det overskriver alle gamle BigDecimal-strengværdier i processen). Du skal muligvis kommentere eventuelle valideringer, du har på modellen, som forventer det gamle felt.
Mongoid.identity_map_enabled = false
Transaction.all.each_with_index do |t,i|
puts i if i%1000==0
t.rename :amount2, :amount
end
Dette er atomært og kræver ikke en lagring på modellen.
- opdater din model, så den afspejler den nye kolonnetype
field :amount, type: Integer
- implementer og bring webstedet op igen
Som nævnt tror jeg, der er en bedre måde, så hvis nogen har nogle tips, så del gerne. Tak!