23

私は、バックエンドとしてMongoDBを使用し、ORMツールとしてMongoMapperを使用してRailsアプリケーションを構築しています。バージョン1で、次のモデルを定義するとします。

class SomeModel
  include MongoMapper::Document
  key :some_key, String
end

バージョン2の後半で、モデルに新しい必須キーが必要であることに気付きました。したがって、バージョン2では、SomeModelは次のようになります。

class SomeModel
  include MongoMapper::Document
  key :some_key, String
  key :some_new_key, String, :required => true
end

既存のすべてのデータを移行してsome_new_keyを含めるにはどうすればよいですか?既存のすべてのドキュメントに適切なデフォルト値を設定する方法を知っていると仮定します。これをさらに一歩進めて、バージョン3で、some_keyがまったく必要ないことに気付いたとします。これで、モデルは次のようになります

class SomeModel
  include MongoMapper::Document
  key :some_new_key, String, :required => true
end

しかし、私のデータベースにあるすべての既存のレコードにはsome_keyの値が設定されており、この時点でスペースを浪費しているだけです。そのスペースを再利用するにはどうすればよいですか?

ActiveRecordを使用すると、some_new_keyの初期値を追加し(version1-> version2移行の場合)、some_keyの値を削除する(version2-> version3移行の場合)移行を作成します。

MongoDB / MongoMapperでこれを行う適切な方法は何ですか?どの移行が実行されたかを追跡する何らかの方法がまだ必要であるように私には思えます。そのようなものは存在しますか?

編集:人々は私の質問の要点を見逃していると思います。データベースでスクリプトを実行して、データベース内のデータを変更または再構築できるようにしたい場合があります。上記の2つの例を示しました。1つは新しい必須キーが追加された例で、もう1つはキーを削除してスペースを再利用できる例です。これらのスクリプトの実行をどのように管理しますか?ActiveRecordの移行により、これらのスクリプトを実行し、実行済みのスクリプトと実行されていないスクリプトを簡単に判別できます。データベースの更新を行うMongoスクリプトを作成することはできますが、私が探しているのは、どのアップグレードスクリプトが既に実行されているかを追跡できる移行のようなフレームワークです。

4

9 に答える 9

13

Mongrationsをチェックしてください...私はちょうどそれについて読み終え​​ました、そしてそれはあなたが求めているもののように見えます。

http://terrbear.org/?p=249

http://github.com/terrbear/mongrations

乾杯!Kapslok

于 2010-03-15T06:05:37.677 に答える
1

1つのオプションは、update操作を使用してすべてのデータを一度に更新することです。マルチアップデートは開発リリースの新機能であるため、そのうちの1つを使用する必要があります。

于 2009-11-20T19:26:10.060 に答える
1

私が作成したこの矛盾を試すことができますが、現時点では、mongoidとrails 3(ベータ3)でのみ機能します。http://github.com/adacosta/mongoid_rails_migrations。最終的にはレール3にアップグレードされます。

于 2010-05-13T15:19:54.937 に答える
1

また、MongoMapper移行用の別のgem https://github.com/alexeypetrushin/mongo_mapper_ext

于 2011-05-18T22:56:38.437 に答える
1

Mongrationsは非常に古い宝石であり、完全に非推奨になっています。使用しないことをお勧めします。

Exodusは、Mongoにとって非常に優れた移行フレームワークであり、次のようなものが必要になる可能性があります。

https://github.com/ThomasAlxDmy/Exodus

于 2013-11-13T18:38:29.693 に答える
1

これをビルドするだけです:https ://github.com/eberhara/mongration-これは通常のノードモジュールです(npmにあります)。

優れたmongodb移行フレームワークが必要でしたが、見つからなかったため、フレームワークを構築しました。

通常の移行フレームワークよりも優れた機能がたくさんあります。

  • チェックサム(以前に実行した移行が古いバージョンと一致しない場合にエラーを発行します)
  • 移行状態をmongoに永続化します(通常の状態ファイルはありません)
  • レプリカセットへの完全なサポート
  • 自動ハンドルロールバック(開発者はロールバック手順を指定する必要があります)
  • 複数の移行(同期または非同期)を同時に実行する機能
  • 異なるデータベースに対して同時に移行を実行する機能

それが役に立てば幸い!

于 2015-12-14T16:46:36.653 に答える
0

クリント、

更新を行うためのコードを記述できますが、独自のフィールドに基づいてレコードを更新することはサポートされていないようです。

そのような場合、私は次のことを行い、サーバーに対して実行しました。

------------------------------
records = Patient.all()

records.each do |p|
  encounters = p.encounters
  if encounters.nil? || encounters.empty?
    mra = p.updated_at
    #puts "\tpatient...#{mra}"
  else
    mra = encounters.last.created_at
    #puts "\tencounter...#{mra}"
  end
  old = p.most_recent_activity
  p.most_recent_activity = mra
  p.save!
  puts "#{p.last_name} mra: #{old} now: #{mra}"
end
------------------------------
于 2010-07-28T17:37:41.380 に答える
-1

Activerecord :: Mirationに接続して、「移行」スクリプトを自動化および追跡できると思います。

于 2010-02-12T17:11:59.617 に答える
-5

MongoDBは、スキーマのないデータベースです。そのため、移行はありません。データベース自体では、オブジェクトがいつでもキー:some_keyまたはキー:some_other_keyを持っているかどうかは関係ありません。

MongoMapperはこれにいくつかの制限を適用しようとしますが、データベースは非常に柔軟であるため、これらの制限を自分で維持する必要があります。すべてのオブジェクトにキーが必要な場合は、スクリプトを実行して既存のオブジェクトのキーを更新するか、オブジェクトに遭遇したときにそのキーを持たないオブジェクトの場合を処理してください。

私自身はMongoDBにかなり慣れていませんが、私が見る限り、スキーマのないdbの柔軟性により、これを処理する必要があります。

于 2009-11-20T18:09:00.147 に答える