MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Ubah jenis bidang di Mongoid tanpa kehilangan data

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kueri MongoDB berdasarkan nilai saat kunci induk tidak diketahui

  2. agregasi MongoDB yang berbeda

  3. MEAN Stack:Bagaimana cara memperbarui hasil fungsi ke database?

  4. $filter hingga 2 level bersarang di mongodb

  5. node.js moongodb dua temuan