2011-02-01 15 views
1

モデルを関連モデルで参照するのではなく、モデルを埋め込むためにMongoDBデータベースを設計していたので、私は悪い決断を下しました。今では、埋め込みモデルを参照モデルにする必要がありますが、データベース(またはドキュメント)には既に健全な量のデータがあります。データを失うことなくモデルを埋め込みから参照に変更できますか?

私はモンゴイドを使用していますので、embedded_inreferenced_inに変更することができます。私が始める前に、私は自分よりもよく知っている人に尋ねると思った。どのようにして、データベースに既に埋め込まれているデータを関連するモデルの文書に変換することができますか?

class Building 

    embeds_many :landlords 

.. 
end 

class Landlord 
    embedded_in :building 
... 
end 

答えて

0

短い回答 - インクリメンタルに。

  1. ランドルフのコピーを作成して、Landlord2という名前を付けます。
  2. ビルディングで参照してください。
  3. すべてのデータを地主から地主2にコピーします。
  4. 地主を削除してください。
  5. Landlord2をLandlordに改名します。

ユーザーは、手順3〜5(理想的には)の間に家主をCRUDすることはできません。あなたはまだ4-5でロックCRUDだけで逃げることができます。家主を削除する前に、コピー中に起こったすべての更新を確実に行うようにしてください。

0

あなたが上記のようにモデルをちょうど揚げてもうまくいかない場合、古いデータはまだdbの別の構造になります。

これまでの回答と非常によく似ていますが、以前にこの移行を実行したことの1つは、システムが実行されている間にユーザーが使用している間に動的に行うことです。

ロジックからデータレイヤーを分離していましたので、いくつかのプリプロセッサを追加して、次のことを行うためのコードを挿入しました。

古いデータモデルから始めて、次のような新しいコードをリリースします: ドキュメントへのアクセスごとに、埋め込みプロパティが存在するかどうかをチェックしなければなりません参照として使用し、データベースに保存し、埋め込みプロパティをドキュメントから削除します。数日間この作業が完了すると、多くのデータが移行されてしまいました。その後、触れられていないすべてのスクリプトに対して同様のスクリプトを実行しなければならず、データを簡単かつ簡単に移行できるようになりました。長時間実行されているスクリプトを実行するか、またはシステムをオフラインにして変換を実行します。

この要件を満たしていない可能性がありますので、それに応じて選択してください。

関連する問題