🤔

Firebase バッチ処理

2023/08/03に公開

はじめに

Cloud Firestoreを使用している際に、複数のドキュメントに対して同時に書き込みを行わなければいけない時があり、初めてバッチ処理を使用したのでメモ

手順

いつもは1つのドキュメントに対してしか書き込みを行わなかったので下記のコードで済んでいた。

// Cloud Firestore ドキュメント引用
import { doc, updateDoc } from "firebase/firestore";

const washingtonRef = doc(db, "cities", "DC");

await updateDoc(washingtonRef, {
  capital: true
});

複数のドキュメントに対して一括で書き込みを行いたい場合は、バッチ処理 の使用を推奨。

// Cloud Firestore ドキュメント引用
import { writeBatch, doc } from "firebase/firestore"; 

// 新たなバッチを取得
const batch = writeBatch(db);

// 新たにドキュメント作成する場合は、set()を使用
const nycRef = doc(db, "cities", "NYC");
batch.set(nycRef, {name: "New York City"});

// 既存のドキュメントを更新したい場合は、update()を使用
const sfRef = doc(db, "cities", "SF");
batch.update(sfRef, {"population": 1000000});

// ドキュメントを削除したい場合は、delete()を使用
const laRef = doc(db, "cities", "LA");
batch.delete(laRef);

// 最後に保存
await batch.commit();

注意点

  • バッチ処理は一度に 500件 のみ書き込みが可能な為、それ以上の書き込みを一括で行おうとするとエラーになる。
  • バッチ処理は失敗した書き込み操作があった場合でも、それ以外の書き込み操作は実行される為、部分的な成功となってしまう。その為、1つでも失敗した書き込みがあった場合にすべての書き込みをロールバック(キャンセル)させたいときは、トランザクション処理を使用しなければならない。

参考

https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja

Discussion