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

Thời gian chạy mô hình thay đổi với mongodb / mongoid

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Không thể kết nối với hình ảnh docker mongo bằng mongoose

  2. Tùy chọn Spring Data-MongoDb cho phương pháp tổng hợp

  3. Hiệu quả khi chèn vào mongodb (pymongo)

  4. Thêm dữ liệu bên trong tài liệu trong Mongo DB bằng PHP

  5. MongoDB - Cập nhật hoặc Chèn đối tượng trong mảng