一千萬個為什麽

搜索

運行時更改模型與mongodb/mongoid

我要在mongoid模型中添加幾個字段,我知道沒有使用MongoDB進行遷移但是如果我不繼續刪除數據庫,使軌道完全“重新生成”數據庫,它就不顯示或使用新字段一點都沒!

什麽是最好的方式去這裏?有什麽比放棄/重新打開mongodb更軟的東西嗎?

提前致謝 盧卡

最佳答案

通常,應該可以在運行時使用新字段更新舊文檔。 MongoDB中不需要遷移。

您可能希望編寫rake任務以使用新字段和默認值更新舊文檔。

您可以通過檢查默認值為零的新字段來查找這些文檔。


更新</強>

簡約風格:

如果使用默認值定義新字段,則只要設置新值,就應始終使用此值:

應用程序/模型/ 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

如果您查詢數據庫,則應在擴展名之前獲取沒有此字段的文檔的默認值:

(rails console)

MyModel.first
#=> #

我在Ruby 1.9.2上用一個新的rails堆棧和一個當前的mongoid來測試它 - 也應該與其他堆棧一起使用。

更復雜/更復雜的風格:

如果您沒有設置默認值,則此新字段將為nil。

應用程序/模型/ my_model.rb

class MyModel
  include Mongoid::Document
  field :name, type: String
  field :data, type: String
  # NEW FIELD
  field :note, type: String
end

(rails console)

MyModel.first
#=> #

然後,您可以設置rake任務和遷移文件,如下例所示:

LIB /任務/ 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

使用 rake mymodel:migrate 運行此遷移。

這只是一個起點,您可以將其擴展為完整的mongoid遷移引擎。

The task :migrate => :environment do … is necessary, otherwise rake won't load models.

轉載註明原文: 運行時更改模型與mongodb/mongoid