温度計センサーや株価データなど、ローカルPCにあるデータをCloud Firestoreにアップロードしたいことがあるかと思います。
Cloud Firestore に JSONデータ をアップロードする
たとえば、以下のような s01a.json
ファイルがあるとします。このデータをFirestoreにアップロードします。
[ { "number" : "001", "rarity" : "RR", "shop" : "yuyutei", "id" : "sm11a_001", "price" : 200, "date" : "2020-05-05T15:47:13Z", "sortDate" : "20200506", "version" : "sm11a", "name" : "フシギバナ&ツタージャGX" } ]
ローカルPCで node import_json.js s01a.json
を実行すると、Firestoreへこのようにデータがアップロードされるところまでを本記事では紹介したいと思います。
Firebase ConsoleでWebアプリ設定をする
Firestoreにデータをアップロードする際には、APIキーが必要になります。
FirebaseコンソールでWebアプリの設定をしてください。設定ボタンをクリックして、「プロジェクトを設定」を選択します。
マイアプリから「Webアプリ」プラットフォームを選択します。
Firebase SDK snippetが生成されるので、この中から apiKey
、authDomain
、projectId
を取得します。
Firestoreへアップロードするスクリプトを実装する
ファイルを読みこんで JSONオブジェクトを取得するコードは「Node.jsで コマンドラインのパラメータを取得する - 酢ろぐ!」を参考にして import_json.js
を実装した。
ここでは僕が使いやすいようにFirestoreへアップロードしているけど、もしこの記事を読む人がいるのであれば「読みこんだデータをFirestoreへアップロードする」以降の部分を適宜読み替えて欲しい。
'use strict'; const fs = require('fs'); const firebaseAdmin = require('firebase-admin'); // JSONのパスを取得する if (process.argv.length < 3) { console.log('error'); process.exit(0); } const path = process.argv[2]; console.log('file path: ' + path); let rawdata = fs.readFileSync(path); let prices = JSON.parse(rawdata); firebaseAdmin.initializeApp({ apiKey: "****", authDomain: "****.firebaseapp.com", projectId: "****" }); const db = firebaseAdmin.firestore(); // 読みこんだデータをFirestoreへアップロードする prices.forEach(function(obj) { const ts = firebaseAdmin.firestore.FieldValue.serverTimestamp(); // カードIDをキーにしてコレクションにインポートする db.collection("cards").doc(obj.id).set({ id: obj.id, name: obj.name, price: obj.price, shop: obj.shop, updated_at: ts }).then(function(docRef) { console.log("Document written with ID: ", docRef.id); }); // 日別にサブコレクションにインポートする db.collection("cards").doc(obj.id).collection('prices').doc(obj.sortDate).set({ date: obj.sortDate, price: obj.price, created_at: ts, updated_at: ts }); });
この例では updated_at
のみが更新されるように見えるが、Firestoreの onCreateイベントをリスナー登録しておいて created_at
を突っ込めばなんとかなりそう。
export GOOGLE_APPLICATION_CREDENTIALS="/Users/ch3cooh/firebase/***/firebase-adminsdk.json” node import_json.js ./testdata/s01a.json
参考記事
実行環境
- Node.js v12.14.0
- npm 6.14.4
- firebase-admin 8.12.0