FirestoreにCSVをImportする方法

2019年5月18日

現時点(2018年11月時点)ではFirestoreは未だベータ版な上に公式がCSVのimport / exportに対応していないため、自分でimport / exportをサポートするアプリケーションを作らないといけない。この記事では簡易的に作った、FirestoreにCSVのimport / exportをサポートするアプリケーションについて書いて行きます。

1.  準備する

1-1. モジュールのインポートと初期設定

Import / Export用のアプリケーションにはNode.jsを使います。

それではアプリケーションを作るディレクトリへ移動し、以下のモジュールをターミナルからインストールしましょう。

  1. csv-parse
  2. firebase-admin
  3. fs

必要なモジュールをインストールしたら、package.jsonを作りましょう。

package.jsonに記載する情報を聞かれるので、順に答えて行ってください。以下、参考です。

1-2. Firebase ServiceAccountの用意

Firebase Admin SDKを使うには、ServiceAccountのjsonファイルが必要になります。ServiceAccountファイルは、Firebaseの管理画面の「プロジェクトの設定」>「サービスアカウント」からダウンロード出来ます。ダウンロードしたファイルをさっき作成したpackage.jsonと同じ階層に入れてください。

2. コーディング

2-1. Adminの初期化

準備は整いましたので、index.jsのファイルを作成し、firebase adminの初期化を行いましょう。初期化のコードはFirebase 管理画面の「プロジェクト設定」>「サービスアカウント」のAdmin SDK構成スニペットからコピペ出来ます。

2-2. インポートの流れ

CSVデータをインポートする流れとしては:

  1. CSVファイルをパースする
  2. パースしたCSVデータを forEachで回して空の配列の中にkey-value形式で入れていく。
  3. トランザクションを作成し、インポートする。

それではindex.jsに以下を追加してください。

*一番最初のkey-valueは _idにしてください。これはfirestoreのdocument idに使うので、これが無い場合、データの更新が行えず毎回新しいdocumentが生成されてしまいます。詳しくは次のセクションで説明します。

例えば、以下のようなCSVがあった場合、objects配列の中身はこうなるイメージです:

現在、index.jsは以下のようになっているはずです:

 

2-3. トランザクション

Firestoreのdocument idはdocumentの中には含まれず、一つ上の階層にあります。jsonで表すと↓みたいな感じです:

*Cloud Firestoreのデータモデルを詳しく知りたい方はこちら

ですので、CSVの中にidを含めたとしても、実際のdocument idは別で自動生成されてしまいます。このままだと使い勝手が悪く、更新も行えないため以下の方法を取っています:

分解しながら見ていきましょう。先ほど例にあげたCSVの一番最初のelementで例えていきます。

objects.forEachでobjects配列を回して、もしCSVの_id カラムが空白じゃない場合:

「id1」というdocumentに、(無い場合は生成されます)

↑の内容を書き込み、更新する処理を行なっている。

続いて、先ほど例にあげた最後のelementで例えていきます。

もしCSVの_idカラムが空白の場合:

document id が指定されていないため、新しくdocument が生成され、

↑の内容をdocumentに書き込み、保存します。Document idは自動で生成されます。

 

最終的にindex.jsは以下のようになっているはずです:

 

3. 使ってみる

  1. ターミナルで、index.jsがあるディレクトリに移動する
  2. インポートするcsvがindex.jsと同じ階層にある事を確認し、

    とターミナルコマンドを打つ

    *csvは空の行や列を削除してください。

  3. successと出てきたら成功

 

4. おまけ:データの形式

2-2. でparseしたCSVのデータは全て文字列形式になっています。ですので、空のobjects 配列に入れる前に、必要に応じてデータ形式を変える必要があります。

 

例1) Intの場合:

 

例2) Floatの場合:

 

例3) Arrayの場合:

 

例4) GeoPointの場合:

 

以上、個人的に作ったFirestoreのCSV importをサポートする簡易的なアプリケーションでした。CSVカラムやデータ量から実用的かどうかが違ってきたり、もっと良い方法もあると思いますので、参考程度にして頂ければ幸いです。

追記:Exportの方にもご興味がある方はこちらの記事に書いていますので、よろしければご覧ください。