特定のパスのコレクションに存在するドキュメントの内容が更新された場合に、その更新されたものがDocumentReference
だったら古いものを削除するバックグラウンド関数を実装しました。
export const updateUser = functions
.region(REGION)
.firestore.document("users/{userId}")
.onUpdate(async (snapshot, context) => {
const oldData = snapshot.before.data();
const newData = snapshot.after.data();
if (
"imageRef" in oldData &&
"imageRef" in newData &&
oldData.imageRef != newData.imageRef &&
oldData.imageRef != null &&
newData.imageRef != null
) {
// 古いimageRefを削除する
// ...
}
});
しかし、上記の条件だと、imageRef
が更新されていないにもかかわらず現在のimageRef
が参照するドキュメントが削除されてしまう現象に見舞われました。
実は、上記の条件の部分で1箇所だけ必ずtrue
になってしまう部分があります。
それがこちらです。
oldData.imageRef != newData.imageRef
もし、値に変更がないか比較したいのであれば、次のようにpath
を比較するべきなのでした。
oldData.imageRef.path != newData.imageRef.path
最終的な条件文は次のとおりです。
const oldData = snapshot.before.data();
const newData = snapshot.after.data();
if (
"imageRef" in oldData &&
"imageRef" in newData &&
oldData.imageRef.path != newData.imageRef.path &&
oldData.imageRef != null &&
newData.imageRef != null
) {
// 古いimageRefを削除する
// ...
}
みなさんもDocumentReference
型のフィールドを比較するときは、path
まで含めて比較するようにしましょう。。。さもないと僕みたいに時間を溶かすことになります。。。