MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Thay đổi loại trường trong Mongoid mà không làm mất dữ liệu

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongo _id cho mảng tài liệu con

  2. Hướng dẫn của nhà phát triển về bộ bản sao MongoDB

  3. Cài đặt và sử dụng MongoDB trong Grails 3.x

  4. Spring Data Mongo - Làm thế nào để ánh xạ các thực thể POJO kế thừa?

  5. Nhúng tài liệu với liên kết Thuộc_to trong Mongoid