Open2

MongoDB で初期データをセットアップする方法

nikaeranikaera

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 がある。

他に使えそうなオプションとしては uricollection がある。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 には ./seeddb には test を指定していたので、mongorestore コマンド実行時の初期データの読み込み先は ./seed/test となった。

他に使えそうなオプションとしては urinsInclude が存在する。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 のみをリストアしたい場合は nsIncludetest.sample と指定すれば良い。

メリット

  • 新たにシードデータを別で作成することなく、ローカル環境等の別環境で稼働しているデータベースの内容を、そのまま初期データとして流用することが可能になる

デメリット

  • スキーマを変更した際に、それに対応した初期データを再度セットアップし直す必要があるので都度手間が掛かる
  • バックアップの仕組みを用いてリストアという形で初期データをセットアップするので、コレクションの中身がリストアの度に丸々差し変わってしまう