これに出くわし、リレーショナルデータベースで移行がどのように機能するかを合理的に理解することで、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)
を使用してルートアプリスクリプトにアプリ変数を設定します これは、後でユーザーのスキーマバージョンと比較するために使用されます。 - ここで、すべてのユーザースキーマにschemaVersionプロパティもあることを確認して、その特定のユーザーに対してのみ、アプリケーションスキーマバージョンと現在のMongoDBスキーマの間の変更を検出できるようにします。
-
次に、構成とユーザーバージョンを検出するための単純なミドルウェアを作成する必要があります
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でユーザーのバージョンが更新されていることを確認して、ユーザーが別のバージョンに再度移動しない限り、変更が再度実行されないようにします。