2012-02-17 5 views
13

質問に文脈を少し与えるだけで、基本的にCRUD操作をMongoDbインスタンスにラップするWebアプリケーション(asp mvc)があり、モデルが検証される前に検証と特定のビジネスロジックを実行します保存され、検索されて保存されます。MongoDbでのマイグレーションの処理

新しいバージョンではモデルは変更されていますが、既存のデータは変更されていません。ここには例があります:実際には言語にとらわれない)

public class Person 
{ 
    public Guid Id {get; set;} 
    public string Name {get; set;} 
    public int Age {get;set;} 
    public string BadgeNo {get;set;} 
} 

public class Person 
{ 
    public Guid Id {get; set;} 
    public string Name {get; set;} 
    public int Age {get;set;} 
    public string EmployeeNo {get; set;} // Still contains same data as BadgeNo just called something different 
} 

オブジェクトの構造は変更されていますが、Mongo land i tはまだ従業員ではなく、BadgeNoを渡しています。 SQLの土地では、通常、スキーマを変更し、そのデルタの追加データを更新/挿入/削除するビルドスクリプトの一部として実行される移行スクリプトがあります。

このような種類のマイグレーションをMongoで管理するにはどうすればよいですか? Mongo内のすべてのインスタンスを更新するために使用するスクリプトも用意する必要がありますか?この種のことをするための他の好ましい習慣があります。

件名に何かアドバイスは素晴らしいことだ

===編集===は

それは、現在、私はこれをので、フェージングアウトのアプローチではなく、移行オプションと一緒に行くを希望していますように思えます誰もがこの分野で助けてくれるツールをお勧めします。そうでなければ、各マイグレーション(ロールイン、ロールアウトを前提とする)は、すべてのロジックを含むある種のコンパイル済みアセンブリでなければなりません。 FluentMigratorの行はSQLで作業するのではなく、Mongoと作業しています。現在私のビルドスクリプトはNantを使用していますが、いくつかのルビーツールを見ていますが、.netに相当するものがあるかどうかはわかりません。

答えて

14

二つのアプローチ基本的にあります。

  1. は、アプリケーション・コードは、データ構造の両方の「バージョン」を処理できることを確認し、保存するときに、新しい構造への更新
  2. は、移行スクリプト
  3. を書きます

オプション2の場合、基本的にアプリケーションを停止してコード(高速)とデータ(おそらく)を更新できるように、徐々に更新する方法として、オプション1を使用します。より遅い)。

次に、必要に応じて、データを移行するためにオプション2も実行します。これにより、サイトを停止する必要はなく、バックグラウンドで非同期でうまく実行できます。

+1

私はオプション1を選択し、そのコードを使用して、後でオプション2を実行するマイグレーションユーティリティ(たとえば、コマンドラインアプリケーション)を作成します。古いバージョン。 –

+0

良いアイデアショーン、私は私の答えを更新しました。 – Derick

+2

問題は、複数のバージョンだけをサポートするために維持する必要がある余分なコードがたくさんあり、変更されたモデルごとに20個のファイルが20行あると想像してください。私にとっては、2つ目のオプションは、バージョン間の移動(ロールバックなど)が容易であるほど良いと思われますが、私は少量のダウンタイムには問題ありません。私がオプション2を言うことを多くの人が期待していたので、答えをお寄せいただきありがとうございますが、2番目のアプローチ、つまりビルドスクリプトをどのように自動化するのが最適かを考えていました。 – Grofit

3

戦略は異なる場合があります。そして、彼らは特定のアプリケーションに依存しています。 FacebookのようなサイトについてはDerickが提案したオプション#1を使ってユーザーをまったく打つことはできませんが、が「sells pizza」のサイトを持っている場合は、そう、「読み取りモード」へ

  1. ビルド・サーバ・センドアプリケーション:両方のバージョン(現在、新しいもの)は、シンプルなパッチ適用がより良い選択肢かもしれアプリケーションのような種類のために

    ...など、より複雑なコードを書きます誰でも読むことができますが、何もデータベースに挿入することはできません。

  2. 読み込みモードでプロットしている間、私はデータベースをとり、パッチを適用しています。
  3. パッチが適用されると、データベースのバックアップ、Webサーバーの停止、新しいデータベースと新しいアプリケーションの展開が行われます。

モードを読み取るためにアプリケーションを送信するのですサイトのために再びダウンタイムを減少させることができますが、あなたがリードモードは必要ありません「はピザを販売しています」。

1

現在、私は心の中で誰もがこの地域に人のために

を支援するための任意のツールをお勧めすることができ、これとて、移行オプションではなく、段階的に廃止するアプローチで行くたいと思っていますように思えますまだ解決策を探していますが、MongoMigrationsを見てください。このツールは、mongo csharpドライバのMongoDatabaseを公開してデータベースを操作し、ドライバのすべての機能を使用できるようにします。

関連する問題