👻

【Firebase】Firestore Databaseで条件に一致したドキュメントを更新・削除する

2024/05/31に公開

はじめに

Firestore Databaseでデータ操作を行っている際に、ある条件に一致するドキュメントを更新・削除したいというシチュエーションがありました。
SQLで言うところの、UPDATE FROM [テーブル名] SET [カラム名] = [更新値] WHERE [条件];や、
DELETE FROM [テーブル名] WHERE [条件];のようなことをしたかったのです。
Firestore Databaseではどのようにできるのかな、ということをまとめました。

そもそも条件を絞るには

公式ページにわかりやすくまとまっていました。
https://firebase.google.com/docs/firestore/query-data/queries?hl=ja

それによると、例えば以下の場合は、SQLで言うところのSELECT * FROM cities WHERE state = 'CA';のようなイメージですね。

// Create a reference to the cities collection
final citiesRef = db.collection("cities");

// Create a query against the collection.
final query = citiesRef.where("state", isEqualTo: "CA");

条件に一致したドキュメントを更新・削除する

では、UPDATE FROM [テーブル名] SET [カラム名] = [更新値] WHERE [条件];DELETE FROM [テーブル名] WHERE [条件];のようなことはどうしたらいいのか...という話ですが、結論として『一発で更新・削除する方法はなさそう』でした。
なので、条件に見合うドキュメントを取得して、順番に更新処理を行なっていく形になります。

// Create a reference to the cities collection
final citiesRef = db.collection("cities");

// Create a query against the collection.
final query = citiesRef.where("state", isEqualTo: "CA");

// 取得したドキュメントを更新する
for(Cities cities in cities){
  db.collection("cities").doc('1234567890abcdefg').update({'chief': 'MIKE'});
}

// 取得したドキュメントを削除する
for(Cities cities in cities){
  db.collection("cities").doc('1234567890abcdefg').delete();
}

若干抵抗感があるのですが、

  1. 条件に一致するドキュメントを取得
  2. ループで取得したドキュメントを更新

で操作することで、擬似的にUPDATE FROM [テーブル名] SET [カラム名] = [更新値] WHERE [条件];DELETE FROM [テーブル名] WHERE [条件];を実現しています。

Discussion