【Firebase】Firestoreで複数collectionの更新にトランザクションを使う

FirebaseのFirestoreで複数のコレクションの更新にトランザクションを使いたかったが公式ドキュメントに載ってなかったので書き残します。

firebaseでリレーションを使う場合以下のような形式で保存する必要があります。

items: {
  [item ID]: true,
  [item ID]: true,
  [item ID]: true
}

 

データを削除した時に、別コレクションのリレーション用のフィールドに含まれたIDを削除したりなどコレクションをまたがって更新するケースはよくあり、この時トランザクションを使いたい。

スポンサーリンク

コード

const todoRef = db.collection('todoItems').doc('7PFOXelmZnQ4dDwVSpV4')
const categoryRef = db.collection('categories').doc('ix5PsGyRSAMUjEqcwiwa')

db.runTransaction(async transaction => {
  const [ todoDoc, catDoc ] = await Promise.all([
    transaction.get(todoRef),
    transaction.get(categoryRef),
  ]);

  transaction.update(todoRef, {
    title: todoitem,
  })
  transaction.update(categoryRef, {
    name: category,
  })
})

 

これで複数のコレクションの更新のトランザクションです。

途中で例外が起きた場合はデータの更新がされません。