ニフクラmBaaSお役立ちブログ

スマホアプリ開発にニフクラmBaaS。アプリ開発に役立つ情報をおとどけ!

ncmb-extendを使ってクラスのコピー処理を実装する

https://cdn-ak.f.st-hatena.com/images/fotolife/m/mbaasdevrel/20171212/20171212211252.png

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);

ここから実際の処理ですが、流れとしては次のようになります。

  1. コピー先にある既存データをすべて消す(あれば)
  2. 移行元のデータをすべて取得する(1000件を超えてすべて)
  3. コピー先に順番にデータを保存していく

そして、それぞれ次のメソッドが対応しています。

  1. コピー先にある既存データをすべて消す(あれば)
    copyClass.deleteAll()
  2. 移行元のデータをすべて取得する(1000件を超えてすべて)
    originalClass.fetchMore()
  3. コピー先に順番にデータを保存していく
    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が変わってしまいます。ご注意ください。

NCMBMania/ncmb-extend

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。