酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Node.jsで FirestoreにJSONデータをアップロードする

温度計センサーや株価データなど、ローカル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へこのようにデータがアップロードされるところまでを本記事では紹介したいと思います。

f:id:ch3cooh393:20200508212323p:plain

Firebase ConsoleでWebアプリ設定をする

Firestoreにデータをアップロードする際には、APIキーが必要になります。

FirebaseコンソールでWebアプリの設定をしてください。設定ボタンをクリックして、「プロジェクトを設定」を選択します。

f:id:ch3cooh393:20200511101150p:plain

マイアプリから「Webアプリ」プラットフォームを選択します。

f:id:ch3cooh393:20200511101202p:plain

Firebase SDK snippetが生成されるので、この中から apiKeyauthDomainprojectId を取得します。

f:id:ch3cooh393:20200511101225p:plain

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