2011-09-30 21 views
63

Mongooseスキーマを更新/移行するためのベストプラクティス(またはツール)は、アプリケーションの進化とともにどのようになっていますか?Mongooseのスキーマ変更の扱い

答えて

5

更新:検査済み、これは現在の形では動作しません、その行く右のアイデアを得た、私はかなりの微調整で動作するように単一の移行を得ましたモジュール自体。しかし、いくつかの大きな変更や何らかの形でさまざまなスキーマを追跡することなく、意図したとおりに動作することはありません。


あなたはMongoDBの中に移行を処理するための最良の方法であるように思われている、あなたがそれらを使用すると、ドキュメントの古いスキーマのバージョンに移行することを意図しているマングース・データ・マイグレーションに

をしたいような音。

文書コレクション(ala alter table)で完全なデータセットの移行を実行する必要はありません。サーバーに負荷がかかり、アプリケーション/サーバーのダウンタイムが必要になる可能性があります。場合によっては、すべての文書を取得して新しいスキーマ/変更と呼び出しを適用するスクリプトを書く必要があるかもしれませんが、いつどこで行うべきかを理解する必要があります。例としては、移行スクリプトを実行するために3時間サーバーを停止するよりも、doc initへの移行ロジックを追加することでパフォーマンスが大幅に向上します。

私はこれもかなり役に立ちましたが、基本的に上記をより詳細に繰り返し、本質的に上記のノードパッケージの概念をphpで実装しています。

N.B.モジュールは5ヶ月前のフォークは0ですが、周りを見回していて、abdelsaidのレスポンススタイルよりも優れた/役立つものはありません。

+0

少なくとも、より良いものが出現するまで受け入れる。誰もがコメントを見るわけではないので、その警告にあなたの答えを加えてください。 – mahemoff

+1

メモを追加しました。明日これを行う必要があります。別の問題でブロックされました。 – Louis

+1

更新されました。悲しいことに、むしろ壊れている。もしあなたが何かを見つけたら、私にここで教えてください。あなたが方法を取っていくうちに、アップデートのための適切な解決策が必要なのです。古いバージョンのスキーマを読み込んで、モジュールのような変更を許可するために、各バージョンを追跡する必要があると感じています。悲しいかな、私のマングース知識はこれまでにはかなり欠けています。アクセス! – Louis

32

しかし、MongoDBはRDBMSのスキーマの問題に対応するために生まれました。何かを移行する必要はありません。フィールドが必要な場合は、スキーマ定義にデフォルト値を設定するだけです。

new Schema({ 
    name: { type: string } 
}) 

へ:

new Schema({ 
    name: { type: string }, 
    birthplace: { type: string, required: true, default: 'neverborn' } 
}); 
+1

私は本当にあなたが変更管理の面を扱うことを可能にするRailsの移行のようなツールについて考えていますが、実際にはそういうものはないと私は考えています。 – mahemoff

+0

私はあなたが意味することを知っていますが、私はドキュメントベースのデータベースでそれについてのユーティリティを見たり、間違っていますか?スキーマをMercurial/Subversion/gitのようなソース管理下に置くと、いつでも以前のリビジョンに戻ることができます。 – vimdude

+3

私はそれがSQLデータベースと非常に異なるとは思わない。たとえば、「名前」を「名字」と「姓」フィールドに分割すると、各環境のデータベースに対してその変換を実行し、何とかそれを追跡する必要があります。 – mahemoff

6

私はこの問題を抱えていました。私のスキーマへの変更。いくつかの研究の後で、私はmongoコンソールでupdateMany()関数を使ってアップデートを行い、それがうまくいったと思います。

は、次のようにコードが見えるvimdudeの例にこれを適用するには:

try { db.<collection>.updateMany({ birthplace: null }, { $set: {"birthplace": "neverborn" } }); } catch(e) { print(e); } 

updateMany()関数は、フィルタに基づいて、コレクション内のすべてのドキュメントを更新します。この場合、フィルタは、 'birthplace'フィールドがnullのすべてのドキュメントを探しています。次に、「出生地」という名前のドキュメントに新しいフィールドを設定し、その値を 'neverborn'に設定します。あなたの状況を反映するために変更されたコードを実行した後

は、次のコマンドを実行します

db.<collection>.find().pretty() 

を変更が行われたことを確認します。あなたのコレクションの各ドキュメントの最後に、 "neverborn"の値を持つ新しいフィールド "birthplace"が表示されます。

希望に役立ちます。

関連する問題