0

スキームを設計するのを間違えたので、一方に他方への手動参照を含むドキュメントがある2つのコレクションがあります。親コレクションに他のコレクションが代わりにサブドキュメントとして含まれるように作成する必要があることに気づきました。

問題は、このスキームを、何百ものエントリがすでに作成されている本番環境にすでに配置していることです。私がやりたいのは、なんとかして既存のすべてのデータをスキャンし、サブドキュメントとして参照されているparent_idにアイテムをコピーすることです。

これが私のスキーマの例です:

コレクション1-ユーザー

_id
Name

コレクション2-写真

_id
url
user_id

既存のドキュメントを次のような1つのコレクションに変更する簡単な方法はありますか?

コレクション-ユーザー

_id
Name
Photos: [...]

データベースを正しく設定すると、新しいコードを使用するようにコードを簡単に変更できますが、問題は、ドキュメントを親にすばやく/手続き的にコピーする方法を理解することです。

追加の詳細-MongoHQ.comを使用してMongoDBをホストしています。

ありがとうございました。

4

1 に答える 1

0

あなたの環境の詳細はわかりませんが、この種の変更には通常、次の種類の手順が含まれます。

  1. PhotosUser オブジェクトに配列がある場合、古いコードが文句を言わないことを確認してください。
  2. User新規およびPhotoドキュメントが作成されないように、アプリケーションを「フリーズ」します。
  3. Photoドキュメントを User にコピーする移行スクリプトを実行しますdocuments。これは、javaScript またはドライバーを使用したアプリ コードで簡単に作成できます (以下の例を参照)。
  4. Photosアレイに組み込まれることを期待する新しいバージョンのアプリケーションをデプロイします
  5. アプリケーションを「凍結解除」して、新しいドキュメントの作成を開始します

「フリーズ/フリーズ解除」できない場合は、手順 4 の後にデルタ スクリプトを実行する必要がありますPhoto。これにより、新しいアプリケーションのデプロイ後に新しく作成されたドキュメントが移行されます。

スクリプトは次のようになります (未テスト)。

db.User.find().forEach(function (u) {
    u.Photos = new Array();
    db.Photo.find({user_id : u._id}).forEach(function (p) {
        u.Photos.push(p);
    }
    db.User.Save(u);
}
于 2013-02-19T22:20:59.397 に答える