Oke saya berhasil melewatinya. Saya pikir ada cara yang lebih cepat menggunakan konsol mongo dengan sesuatu seperti ini:MongoDB:Bagaimana cara mengubah jenis bidang?
Tetapi saya tidak dapat membuat konversi berfungsi, jadi pilihlah metode yang lebih lambat ini di konsol Rails dengan lebih banyak waktu henti. Jika ada yang punya solusi yang lebih cepat, silakan posting.
- buat bidang Integer baru dengan nama baru, misalnya
amount2
- konversi setiap
amount
ke nilai yang tepat untukamount2
di konsol atau tugas menyapu
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
Perhatikan bahwa .all.each berfungsi dengan baik (Anda tidak perlu menggunakan .find_each atau .find_in_batches seperti activerecord biasa dengan mysql) karena kursor mongodb. Itu tidak akan mengisi memori selama identity_map dimatikan.
-
matikan situs untuk pemeliharaan, jalankan migrasi sekali lagi untuk mencatat jumlah kolom yang dapat berubah dalam beberapa menit terakhir (seperti
Transaction.where(:updated_at.gt => 1.hour.ago).each_with_index...
-
beri komentar
field :amount, type: BigDecimal
dalam model Anda, Anda tidak ingin mongoid mengetahui bidang ini lagi, dan tekan kode ini - sekarang jalankan skrip lain untuk mengganti nama kolom Anda (ini menimpa semua nilai string BigDecimal lama dalam proses). Anda mungkin perlu mengomentari validasi apa pun yang Anda miliki pada model yang mengharapkan bidang lama.
Mongoid.identity_map_enabled = false
Transaction.all.each_with_index do |t,i|
puts i if i%1000==0
t.rename :amount2, :amount
end
Ini bersifat atomik dan tidak memerlukan penyimpanan model.
- perbarui model Anda untuk mencerminkan jenis kolom baru
field :amount, type: Integer
- menerapkan dan mengembalikan situs
Seperti yang disebutkan, saya pikir ada cara yang lebih baik, jadi jika ada yang punya tips, silakan bagikan. Terima kasih!