Ok, tôi đã vượt qua. Tôi nghĩ rằng có một cách nhanh hơn bằng cách sử dụng bảng điều khiển mongo với một cái gì đó như sau: MongoDB:Làm cách nào để thay đổi loại trường?
Nhưng tôi không thể làm cho chuyển đổi hoạt động, vì vậy đã chọn phương pháp chậm hơn này trong bảng điều khiển rails với nhiều thời gian chết hơn. Nếu ai có giải pháp nhanh hơn, vui lòng đăng nó.
- tạo trường Số nguyên mới với tên mới, giả sử
amount2
- chuyển đổi từng số tiền
amount
đến giá trị phù hợp choamount2
trong bảng điều khiển hoặc tác vụ cào
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
Lưu ý rằng .all.each hoạt động tốt (bạn không cần phải sử dụng .find_each hoặc .find_in_batches như activerecord thông thường với mysql) vì con trỏ mongodb. Nó sẽ không làm đầy bộ nhớ chừng nào ID_map bị tắt.
-
đưa trang web xuống để bảo trì, chạy quá trình di chuyển một lần nữa để nắm bắt bất kỳ trường số tiền nào có thể đã thay đổi trong vài phút qua (chẳng hạn như
Transaction.where(:updated_at.gt => 1.hour.ago).each_with_index...
-
nhận xét ra
field :amount, type: BigDecimal
trong mô hình của bạn, bạn không muốn mongoid biết về trường này nữa và đẩy mã này - bây giờ hãy chạy một tập lệnh khác để đổi tên cột của bạn (nó ghi đè lên bất kỳ giá trị chuỗi BigDecimal cũ nào trong quá trình này). Bạn có thể cần phải nhận xét bất kỳ xác thực nào mà bạn có trên mô hình mong đợi trường cũ.
Mongoid.identity_map_enabled = false
Transaction.all.each_with_index do |t,i|
puts i if i%1000==0
t.rename :amount2, :amount
end
Đây là nguyên tử và không yêu cầu lưu mô hình.
- cập nhật mô hình của bạn để phản ánh loại cột mới
field :amount, type: Integer
- triển khai và đưa trang web trở lại
Như đã đề cập tôi nghĩ có một cách tốt hơn, vì vậy nếu ai có một số mẹo xin vui lòng chia sẻ. Cảm ơn!