🌟
firebase-adminでfirestoreのフィールドを一括追加する
概要
- 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のドキュメントにフィールドを一括で追加する
- 既存のデータを上書きしないようにするには,
merge
をtrue
に指定する必要があります- ここを指定しないと上書きされてしまいます
やっていること
- 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