🚒
Firestoreでシーディング(初期データの一括書き込み)
はじめに
LaravelのようなWebフレームワークを利用していると、RDBへの初期データの登録はSeederを作成して実施するかと思います。
このような初期データの登録をFirestoreでどのようにするかのメモです。
JavaScriptを利用した例(サブコレクションなしの場合)
-
プロジェクトフォルダ作成
-
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");
- 書き込みたいデータの準備
data.json
{
"categories": [
{
"id": 1,
"name": "Category1",
"description": "XXX"
},
{
"id": 2,
"name": "Category2",
"description": "YYY"
},
{
"id": 3,
"name": "Category3",
"description": "ZZZ"
}
]
}
- firebaseを操作するためのmoduleをインストール
npm install --save firebase-admin
npm install --save firestore-export-import
- 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();
- 実行
ターミナル上で以下コマンドを実施
node index.js
該当プロジェクトのFirestore上で、コレクションとドキュメントが作成されているかと思います。
JavaScriptを利用した例(サブコレクションありの場合)
0-1までは上記と同様
- 書き込みたいデータの準備
Jsonではなく、jsでデータを準備する
data.js
const jsonData = {
"categories": [
{
"name": "Category1",
"contents": [
{
"name": "content1"
},
{
"name": "content2"
}
]
},
{
"name": "Category2",
"contents": [
{
"name": "content3"
}
]
}
]
};
module.exports = jsonData;
- firebaseのアクセス許可のためのmoduleをインストール
npm install --save firebase-admin
- 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);
});
- 実行
ターミナル上で以下コマンドを実施
node index.js
該当プロジェクトのFirestore上で、コレクション、サブコレクション、ドキュメントが作成されているかと思います。
Discussion