sql >> データベース >  >> NoSQL >> MongoDB

mongodb/mongoidを使用したランタイム変更モデル

    一般に、実行時に古いドキュメントを新しいフィールドで更新できるはずです。 MongoDBで移行する必要はありません。

    古いドキュメントを新しいフィールドとデフォルト値で更新するrakeタスクを作成することをお勧めします。

    これらのドキュメントは、デフォルトでnil値を持つ新しいフィールドをチェックすることで見つけることができます。

    更新

    簡単なスタイル:

    デフォルト値で新しいフィールドを定義する場合、新しいフィールドを設定する限り、この値を常に使用する必要があります。

    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
    

    データベースにクエリを実行する場合は、拡張機能の前にこのフィールドがないドキュメントのデフォルト値を取得する必要があります。

    (rails console)

    MyModel.first
    #=> #<MyModel …other fields…, note: "no note given so far!">
    

    これを、Ruby1.9.2の現在のモンゴイドを使用した新しいレールスタックでテストしました。他のスタックでも機能するはずです。

    より複雑/複雑なスタイル:

    デフォルト値を設定しなかった場合、この新しいフィールドにはnilが表示されます。

    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
    

    (rails console)

    MyModel.first
    #=> #<MyModel …other fields…, note: nil>
    

    次に、次の例のようにrakeタスクと移行ファイルを設定できます。

    lib / tasks / 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を使用してこの移行を実行します 。

    これは出発点にすぎず、これを完全なモンゴイド移行エンジンに拡張できます。

    task :migrate => :environment do … そうしないと、rakeはモデルをロードしません。



    1. XAMPPOSXでApacheが失敗する原因となるMongoDBphpドライバー

    2. ループで呼び出されたDBクエリから取得したデータを返す際の問題

    3. Mongoで投稿タグを実装するにはどうすればよいですか?

    4. コレクションから最後のxレコードをmongodumpすることは可能ですか?