mBaaSを利用されている方々から良く聞かれる内容に「あるアプリケーション以下にある特定のクラスをコピーしたい」というものがあります。mBaaSは本番環境と開発環境の機能差がないので、アプリケーションキーとクライアントキーを変更するだけですぐに動作環境を変更できます。そうすることで、本番環境さながらのデータを使って開発やテストを行ったり、開発環境で作ったマスターデータを本番環境に反映できます。
しかし、通常そういった処理を行う場合にはエクスポートを実行した上でインポートを行う必要があります。エクスポートは全データが対象になるので時間もかかり、面倒です。
そこで ncmb-extend に用意されているメソッドを使ってクラスコピー機能を作ってみました。
セットアップ
ncmb-extend はNode.js向けに作られていますので、npmを使ってインストールできます。
npm install ncmb-extend --save
コード
まず ncmb-extend と ncmb を読み込みます。
require('ncmb-extend'); const NCMB = require('ncmb');
そして移行元のキー(originalKeys)とコピー先のキー(copyKeys)を用意します。
const originalKeys = { applicationKey: 'YOUR_ORIGINAL_APPLICATION_KEY', clientKey: 'YOUR_ORIGINAL_CLIENT_KEY' }; const copyKeys = { applicationKey: 'YOUR_COPY_APPLICATION_KEY', clientKey: 'YOUR_COPY_CLIENT_KEY' };
そして mBaaSの初期化と、対象になるデータストアのクラスを定義します。
const originalNcmb = new NCMB(originalKeys.applicationKey, originalKeys.clientKey); const copyNcmb = new NCMB(copyKeys.applicationKey, copyKeys.clientKey); const className = 'Example'; const originalClass = originalNcmb.DataStore(className); const copyClass = copyNcmb.DataStore(className);
ここから実際の処理ですが、流れとしては次のようになります。
- コピー先にある既存データをすべて消す(あれば)
- 移行元のデータをすべて取得する(1000件を超えてすべて)
- コピー先に順番にデータを保存していく
そして、それぞれ次のメソッドが対応しています。
- コピー先にある既存データをすべて消す(あれば)
copyClass.deleteAll() - 移行元のデータをすべて取得する(1000件を超えてすべて)
originalClass.fetchMore() - コピー先に順番にデータを保存していく
copyClass.saveAll()
実際の処理は次のようになります。
// 元データをすべて消す console.log('コピー先のデータをすべて消します'); copyClass.deleteAll() .then(() => { console.log('移行元のデータをすべて取得します'); return originalClass.fetchMore(); }) .then((ary) => { console.log('取得したデータをコピー先に保存します'); return copyClass.saveAll(ary); }) .then((objs) => { console.log('コピーが完了しました'); console.log(objs); }) .catch((err) => { console.error('コピー失敗しました'); console.error(err); })
これでデータのコピーが完了します。
最後に
なお、今回の場合は全データを対象としていますが、 fetchMore に通常のデータストアでの検索のように条件を指定すれば一部のデータだけを対象にできます。非同期処理が絡むので普通に処理を書くと長くなりがちですが、 ncmb-extend を使えばごく簡単に分かりやすく書けるでしょう。
注意点として、コピー先では objectId、createDate、updateDateが変わってしまいます。ご注意ください。