Nói chung, có thể cập nhật các tài liệu cũ với các trường mới trong thời gian chạy. Không cần di chuyển trong MongoDB.
Bạn có thể muốn viết các tác vụ cào để cập nhật các tài liệu cũ của mình với các trường và giá trị mặc định mới.
Bạn có thể tìm ra các tài liệu này bằng cách kiểm tra các trường mới có giá trị nil theo mặc định.
Cập nhật
Phong cách dễ dàng:
Nếu bạn xác định một trường mới với giá trị mặc định, thì giá trị này sẽ luôn được sử dụng miễn là bạn đặt một trường mới:
app / models / my_model.rb
class MyModel
include Mongoid::Document
field :name, type: String
field :data, type: String
# NEW FIELD
field :note, type: String, default: "no note given so far!"
end
Nếu bạn truy vấn cơ sở dữ liệu của mình, bạn sẽ nhận được giá trị mặc định cho các tài liệu không có trường này trước tiện ích mở rộng của bạn:
(bảng điều khiển đường ray)
MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">
Tôi đã thử nghiệm điều này với một ngăn xếp đường ray mới với một mongoid hiện tại trên Ruby 1.9.2 - cũng sẽ hoạt động với các ngăn xếp khác.
Phong cách phức tạp / phức tạp hơn:
Nếu bạn không đặt giá trị mặc định, bạn sẽ nhận được nil cho trường mới này.
app / models / my_model.rb
class MyModel
include Mongoid::Document
field :name, type: String
field :data, type: String
# NEW FIELD
field :note, type: String
end
(bảng điều khiển đường ray)
MyModel.first
#=> #<MyModel …other fields…, note: nil>
Sau đó, bạn có thể thiết lập một tác vụ rake và tệp di chuyển như trong ví dụ này:
lib / task / my_model_migration.rake:
namespace :mymodel do
desc "MyModel migration task"
task :migrate => :environment do
require "./db/migrate.rb"
end
end
db / migrate.rb:
olds = MyModel.where(note: nil)
# Enumerator of documents without a valid :note field (= nil)
olds.each do |doc|
doc.note = "(migration) no note given yet"
# or whatever your desired default value should be
doc.save! rescue puts "Could not modify doc #{doc.id}/#{doc.name}"
# the rescue is only a failsafe statement if something goes wrong
end
Chạy quá trình di chuyển này với rake mymodel:migrate
.
Đây chỉ là một điểm khởi đầu và bạn có thể mở rộng điều này cho một công cụ di chuyển mongoid đầy đủ.
Tác vụ task :migrate => :environment do …
là cần thiết, nếu không rake sẽ không tải các mô hình.