sql >> Database teknologi >  >> NoSQL >> MongoDB

Skift felttype i Mongoid uden at miste data

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 for amount2 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!




  1. Mongo DB-aggregering med en række objekter

  2. Meteor:hvordan returnerer jeg data fra felter i et bestemt objekt?

  3. MongoDB og Asp Core opdaterer kun en nøgle:værdipar i stedet for hele modellen

  4. Upload data til Meteor / Mongo DB