私はMongoDBとMongooseをまったく初めて使用しているため、スキーマが変更されたときに移行を処理する方法についての答えが見つからないようです。
私は、テーブル構造と変更が必要な基本データを変更する移行 SQL スクリプトを実行することに慣れています。これには通常、DB のダウンタイムが伴います。
これは通常、MongoDB/Mongoose 内でどのように処理されますか? 知っておく必要がある落とし穴はありますか?
これに遭遇し、リレーショナル データベースで移行がどのように機能するかを合理的に理解することで、MongoDB はこれを少し簡単にします。これを分解する方法は 2 つあります。MongoDB でのデータ移行を処理する際に考慮すべき事項 (RDB では珍しいことではありません) は次のとおりです。
1) 変更によって全員がログアウトするか、アプリケーションのダウンタイムが予想される場合、これを行う簡単な方法は、ローカルまたはライブの MongoDB に接続して正しいデータをアップグレードするための移行スクリプトを用意することです。ユーザーの名前が単一の文字列から与えられた姓を持つオブジェクトに変更される例 (もちろん非常に基本的なものであり、すべての開発者に対して実行するにはスクリプトに入れる必要があります):
CLI の使用:
mongod
use myDatabase
db.myUsers.find().forEach( function(user){
var curName = user.name.split(' '); //need some more checks..
user.name = {given: curName[0], family: curName[1]};
db.myUsers.save( user );
})
2) 実行中のアプリケーションのバージョンに基づいて、アプリケーションでスキーマを上下に移行する必要があります。これにより、ライブ サーバーの負担が明らかに軽減され、ユーザーがアップグレード/ダウングレードされたバージョンを初めて使用するときにのみアップグレードされるため、ダウン タイムは必要ありません。
Expressjs for Nodejs でミドルウェアを使用している場合:
app.set('schemaVersion', 1)
後でユーザーのスキーマ バージョンと比較するために使用するルート アプリ スクリプトでアプリ変数を設定します。次に、構成とユーザーのバージョンを検出するための単純なミドルウェアを作成する必要があります
app.use( function( req, res, next ){
//If were not on an authenticated route
if( ! req.user ){
next();
return;
}
//retrieving the user info will be server dependent
if( req.user.schemaVersion === app.get('schemaVersion')){
next();
return;
}
//handle upgrade if user version is less than app version
//handle downgrade if user version is greater than app version
//save the user version to your session / auth token / MongoDB where necessary
})
アップグレード/ダウングレードの場合、ユーザーモデルを受け入れてMongoDBの特定のユーザーで移行の変更を実行するアップグレード/ダウングレードエクスポート機能を使用して、移行ディレクトリの下に単純なjsファイルを作成します。最後に、ユーザーのバージョンが MongoDB で更新されていることを確認して、別のバージョンに再度移動しない限り、変更を再度実行しないようにします。
SQL 型の移行や Rails のような移行に慣れている場合は、cli ツールのmigrate- mongoose が最適であることがわかります。
up
および関数を使用して移行を記述し、移行down
の成功と失敗に基づいて状態を管理できます。
ES 2015 構文を使用している場合は、ES6 もサポートします。
オブジェクトを介してマングース モデルにアクセスできるためthis
、モデルやスキーマに必要な変更を簡単に行うことができます。