FirestoreのデータをCSVとして出力する方法
現時点(2018年12月時点)ではFirestoreは未だベータ版な上に公式がCSVのimport / exportに対応していないため、自分でimport / exportをサポートするアプリケーションを作らないといけません。この記事では簡易的に作った、firestoreにcsvのimport / exportをサポートするアプリケーションについて書いて行きます。
「FirestoreにCSVをImportする方法」を先にご覧になった場合、1-1. で記述している「json2csv」のnpmをインストールしている以外は大体同じですので、「json2csv」をインストールしたら2-2. エクスポートの流れまで読み飛ばして頂いて大丈夫です。
1. 準備する
1-1. モジュールのインポートと初期設定
Import / export用のアプリケーションにはNode.jsを使います。それではアプリケーションを作るディレクトリへ移動し、以下のモジュールをターミナルからインストールしましょう。
1 |
npm install firebase-admin json2csv |
必要なモジュールをインストールしたら、package.jsonを作りましょう。
1 |
npm init |
package.jsonに記載する情報を聞かれるので、順に答えて行ってください。以下、参考です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "name": "firestoreimportexport", "version": "1.0.0", "description": "supports csv import and export for firestore", "main": "index.js", "dependencies": { "csv-parse": "^3.2.0", "firebase-admin": "^6.1.0", "fs": "^0.0.1-security" }, "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Orange", "license": "ISC" } |
1-2. Firebase ServiceAccountの用意
Firebase Admin SDKを使うには、ServiceAccountのjsonファイルが必要になります。ServiceAccountファイルは、Firebaseの管理画面の「プロジェクトの設定」>「サービスアカウント」からダウンロード出来ます。ダウンロードしたファイルをさっき作成したpackage.jsonと同じ階層に入れてください。
2. コーディング
2-1 Adminの初期化
準備は整いましたので、index.jsのファイルを作成し、firebase adminの初期化を行いましょう。初期化のコードはFirebase 管理画面の「プロジェクト設定」>「サービスアカウント」のAdmin SDK構成スニペットからコピペ出来ます。
1 2 3 4 5 6 7 8 |
var admin = require("firebase-admin"); const fs = require('fs'); var serviceAccount = require("path/to/serviceAccountKey.json"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: "https://[projectID].firebaseio.com" }); |
2-2. エクスポートの流れ
FirestoreのデータをCSVにエクスポートする流れとしては、以下のようになっています:
- FirestoreのコレクションデータをJSONとして書き出す
- 書き出したJSONファイルをCSVに変換する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
let collectionName = process.argv[2]; //ターミナルコマンドの2番目の引数を取ってきます let db = admin.firestore(); db.settings({ timestampsInSnapshots: true }); let data = []; let results = db.collection(collectionName) .get() .then(snapshot => { snapshot.forEach(doc => { data.push({ _id: doc.id, hogehoge: doc.data()["hogehoge"], fugafuga: doc.data()["fugafuga"] }) }) return data; }) .catch(error => { console.log(error); }) results.then(dt => { fs.writeFile("export.json", JSON.stringify(data), function(err) { if(err) { return console.log(err); } console.log("JSONファイルのエクスポート成功!"); }); }) |
collectionがいっぱいある場合、いちいちファイルにcollection名を書き込むのも面倒なので、process.argv[2]でターミナルコマンドの2番目の引数を取ってくるようにしています。そしてcollectionから取得したデータを空の配列に格納し、fs moduleを使いJSONファイルとして書き出しています。
最終的に、index.jsは以下のようになっているはずです:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
var admin = require("firebase-admin"); const fs = require('fs'); var serviceAccount = require("path/to/serviceAccountKey.json"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: "https://[projectID].firebaseio.com" }); let collectionName = process.argv[2]; let db = admin.firestore(); db.settings({ timestampsInSnapshots: true }); let data = []; let results = db.collection(collectionName) .get() .then(snapshot => { snapshot.forEach(doc => { data.push({ _id: doc.id, hogehoge: doc.data()["hogehoge"], fugafuga: doc.data()["fugafuga"] }) }) return data; }) .catch(error => { console.log(error); }) results.then(dt => { fs.writeFile("export.json", JSON.stringify(data), function(err) { if(err) { return console.log(err); } console.log("JSONファイルのエクスポート成功!"); }); }) |
3. JSONファイルをCSVに変換
JSONファイルがあるディレクトに移動し、以下のコマンドをターミナルに打ってください:
1 |
json2csv -i export.json -f _id,hogehoge,fugafuga -o export.csv |
見た通りですが、ヘッダを指定してCSVファイルに変換しています。成功している場合、JSONファイルと同じディレクトリ先に出力されているはずです。
以上、個人的に作ったFirestoreのCSV exportをサポートする簡易的なアプリケーションでした。Importの方にもご興味がある方はこちらの記事に書いていますので、よろしければご覧ください。