🚒

Firestoreでシーディング(初期データの一括書き込み)

2023/03/30に公開

はじめに

LaravelのようなWebフレームワークを利用していると、RDBへの初期データの登録はSeederを作成して実施するかと思います。

このような初期データの登録をFirestoreでどのようにするかのメモです。

JavaScriptを利用した例(サブコレクションなしの場合)

  1. プロジェクトフォルダ作成

  2. Firebaseの秘密鍵を取得
    Firebaseのコンソール上で、
    プロジェクトの設定>サービスアカウント>Firebase Admin SDK>新しい秘密鍵の生成
    すると、jsonファイルがダウンロードされますので、こちらをプロジェクトに追加してください。

config.json一部抜粋
{
  "type": "service_account",
  "project_id": "XXX",
  "private_key_id": "YYY",
  "private_key": "ZZZ",
}

今回、ファイル名をconfig.jsonに変更してあります。
必要に応じて、4.のパスをご調整ください。
var serviceAccount = require("./config.json");

  1. 書き込みたいデータの準備
data.json
{
  "categories": [
    {
      "id": 1,
      "name": "Category1",
      "description": "XXX"
    },
    {
      "id": 2,
      "name": "Category2",
      "description": "YYY"
    },
    {
      "id": 3,
      "name": "Category3",
      "description": "ZZZ"
    }
  ]
}
  1. firebaseを操作するためのmoduleをインストール
npm install --save firebase-admin
npm install --save firestore-export-import
  1. index.jsの作成
index.js
var admin = require("firebase-admin");
var serviceAccount = require("./config.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

var fireStoreService = require('firestore-export-import');

const firebaseSeeding = async () => {
    try {
        await fireStoreService.restore('./data.json');
    } catch (e) {
        console.log(e);
    }
}

firebaseSeeding();
  1. 実行
    ターミナル上で以下コマンドを実施
node index.js

該当プロジェクトのFirestore上で、コレクションとドキュメントが作成されているかと思います。

JavaScriptを利用した例(サブコレクションありの場合)

0-1までは上記と同様

  1. 書き込みたいデータの準備
    Jsonではなく、jsでデータを準備する
data.js
const jsonData = {
  "categories": [
    {
      "name": "Category1",
      "contents": [
        {
          "name": "content1"
        },
        {
          "name": "content2"
        }
      ]
    },
    {
      "name": "Category2",
      "contents": [
        {
          "name": "content3"
        }
      ]
    }
  ]
};

module.exports = jsonData;

  1. firebaseのアクセス許可のためのmoduleをインストール
npm install --save firebase-admin
  1. index.jsの作成
index.js
const jsonData = require('./data.js');
var admin = require("firebase-admin");
var serviceAccount = require("./config.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

var db = admin.firestore();
const batch = db.batch();

// JSONデータをループして、categoriesドキュメントをバッチ書き込みに追加する
jsonData["categories"].forEach(categoryData => {
  const categoryRef = db.collection("categories").doc();
  batch.set(categoryRef, categoryData);

  // サブコレクションがある場合は、同様にバッチ書き込みに追加する
  if (categoryData.contents) {
    categoryData.contents.forEach(contentData => {
      const contentRef = categoryRef.collection('contents').doc();
      batch.set(contentRef, contentData);
    });
  }
});

batch.commit().then(() => {
  console.log("バッチ書き込みが完了しました");
}).catch((error) => {
  console.error("バッチ書き込みに失敗しました", error);
});
  1. 実行
    ターミナル上で以下コマンドを実施
node index.js

該当プロジェクトのFirestore上で、コレクション、サブコレクション、ドキュメントが作成されているかと思います。

Discussion