🌟

firebase-adminでfirestoreのフィールドを一括追加する

2022/05/17に公開

概要

  • Firestoreのフィールドを一括で追加する

背景

  • firestoreをfirebaseコンソールから直接ぽちぽちと更新することはできますが、正直面倒くさいです
  • なので、コマンド一発で全て更新したいと考えました

前提

  • node v16.13.2
  • npm 8.10.0
  • "firebase-admin": "^10.2.0"
  • yarn 1.22.11

参考

nodeプロジェクトを作成する

  • firebaseフォルダを作成
    • mkdir firebase
    • フォルダ名は任意
  • firebaseフォルダに移動
    • cd firebase
  • npmを初期化
    • yarn init
  • firebase-adminパッケージを追加
    • yarn add firebase-admin

Firebaseのサービスアカウントを作成し、鍵を取得

  • Firebase Admin SDKでFirestoreにアクセスするため、サービスアカウントの .json秘密鍵が必要
    • 新しい秘密鍵の生成からjsonファイルをダウンロードする

注意点

  • 本番のfirestoreを更新する場合、上書きなどしないか最新の注意点を払いましょう
    • 筆者は最初、staging環境ですが上書きしてしまいました

Firestoreのドキュメントにフィールドを一括で追加する

  • 既存のデータを上書きしないようにするには, mergetrueに指定する必要があります
    • ここを指定しないと上書きされてしまいます

やっていること

  • firebase-admin初期化
  • サービスアカウントの秘密鍵(jsonファイル)を取得
  • ドキュメントのスナップショットを取得
  • スナップショット分、ループ処理でドキュメントにフィールドを追加するbatch処理をセットする
  • batch処理を実行

全文

  • コレクション名は適宜変えてください
    • 例:posts
const {
  initializeApp,
  cert,
} = require("firebase-admin/app");
const {
  getFirestore,
} = require("firebase-admin/firestore");

const serviceAccount = require("先ほどダウンロードしたjsonファイルのパス");

(async () => {
  try {
    initializeApp({
      credential: cert(serviceAccount),
    });
    const db = getFirestore();

    const querySnapshot = await db.collection("posts").get();
    const batch = db.batch();
    querySnapshot.forEach((postDoc) => {
      batch.set(
        db.collection("posts").doc(postDoc.id),
        {
          publishStatus: 1,
        },
        { merge: true }
      );
    });

    await batch.commit();
  } catch (err) {
    console.log(`Error: ${JSON.stringify(err)}`);
  }
})();

Discussion