MongoDB で初期データをセットアップする方法
mongodump と mongorestore を使った方法
初期データをセットアップするための方法として、既存データベース内のデータを抜き出して、それを別環境にリストアすることで初期データをセットアップする方法がある。
mongodump で既存データベースからデータを抜き出す
# mongodump コマンドで既存テーブル内のデータを全て抜き出す
mongodump --host=localhost --port=27017 --username=root --authenticationDatabase=admin --password=password --db=test --out=./seed --forceTableScan
mongodump では下記オプションを指定する必要があった。
オプション名 | 説明 | サンプル |
---|---|---|
host | ホスト名 | localhost |
port | ポート番号 | 27017 |
username | ユーザ名 | root |
password | パスワード | password |
authenticationDatabase | ユーザ情報が格納されているデータベース名 | admin |
db | データベース名 | test |
out | 抜き出したデータの出力先 | ./seed |
forceTableScan | index を有効化せずにコレクションをスキャンする | - |
特筆すべきオプションとしては、forceTableScan
が存在する。forceTableScan
を有効にした状態で mongodump
コマンドでコレクションをスキャンすると _id の index 用いずにスキャンが走る。
例えば特定スキーマで _id に index を貼っていない場合は mongodump
コマンド実行時にエラーが出たりするが、その際に使えるオプションとして forceTableScan
がある。
他に使えそうなオプションとしては uri
と collection
がある。uri
は指定すると MongoDB 接続時の情報を URI で書けるようになるので mongodb://test:test@localhost:27017/?authSource=admin
のような記述が可能となる。collection
は指定すると特定のコレクションのデータのみを mongodump
で出力することが可能となる。
mongorestore で初期データをセットアップする
# mongorestore コマンドで mongodump コマンドで抜き出したデータを特定データベースにリストアする
mongorestore --host=test.mongo.cosmos.azure.com --port=10255 --username=test --password=test --db=test --ssl ./seed/test
mongorestore コマンドでは下記オプションを指定する必要があった。
オプション名 | 説明 | サンプル |
---|---|---|
host | ホスト名 | localhost |
port | ポート番号 | 27017 |
username | ユーザ名 | root |
password | パスワード | password |
db | データベース名 | test |
ssl | TLS/SSL で接続するかどうか | - |
特筆すべきオプションとしては ssl
がある。初期データをセットアップしたい環境がリモートの MongoDB 環境であり接続時に TLS/SSL を要求される場合があるときは、明示的に ssl
オプションを指定することで MongoDB 接続時に TLS/SSL プロトコルで接続を試みるようになった。
また mongorestore
コマンド実行時は mongodump
コマンド実行時とは異なり、./seed/test
のように読み込み先フォルダの末尾に test
を付けている。これは mongodump
コマンドで指定したフォルダ内に db
オプションで指定したフォルダ名でフォルダが作られて、その中に全コレクションデータが出力されるためである。
私の例でいうと mongodump
コマンド実行時の out
には ./seed
を db
には test
を指定していたので、mongorestore
コマンド実行時の初期データの読み込み先は ./seed/test
となった。
他に使えそうなオプションとしては uri
や nsInclude
が存在する。uri
は指定すると MongoDB 接続時の情報を URI で書けるようになるので mongodb://test:test@test.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@test@
のような記述が可能となる。nsInclude
を用いると特定コレクションのみをリストアすることが可能となる。例えば ./seed/test/sample.bson
のみをリストアしたい場合は nsInclude
に test.sample
と指定すれば良い。
メリット
- 新たにシードデータを別で作成することなく、ローカル環境等の別環境で稼働しているデータベースの内容を、そのまま初期データとして流用することが可能になる
デメリット
- スキーマを変更した際に、それに対応した初期データを再度セットアップし直す必要があるので都度手間が掛かる
- バックアップの仕組みを用いてリストアという形で初期データをセットアップするので、コレクションの中身がリストアの度に丸々差し変わってしまう
TypeScript でシードデータ書けるし、Docker Image とか CLI 用意されてたり、シードデータ投入の手段も豊富なので気になる。次は ↓ を検証してみる。