sql >> Database >  >> NoSQL >> MongoDB

Verander het type veld in Mongoid zonder gegevens te verliezen

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




  1. hoe mapreduce te gebruiken in het subdocument mangoest / mongodb?

  2. Redis installeren op Debian 9

  3. Invoegen in sterk genest document MongoDB

  4. Python- en MongoDB-databaseontwikkeling