假设我有一个Employees
的集合和一个Departments
的集合。我还设置了云功能,以便在创建或删除员工时更新部门中的员工数。
import * as functions from "firebase-functions";
import admin = require("firebase-admin");
export const handleEmployeeDeletion = functions.firestore
.document('Employee/{employeeId}')
.onDelete((snapshot, context) => {
const departmentRef = admin.firestore()
.collection("Department").doc(snapshot.data.departmentId);
return departmentRef.update({
employeesCount: admin.firestore.FieldValue.increment(-1)
})
})
如果同时删除两个员工文档,会发生什么情况?只要我使用firestore.FieldValue.increment
,而不是将当前值读取到云函数的RAM,然后从那里写入更新的(可能过时的(值,我就可以安全地避免双重支出吗?
如果需要对字段进行的更改涉及更多的计算,而不是简单地递增,那该怎么办?如何在确保在读取字段的相同旧值后,多个会话不会同时修改同一字段的情况下进行更改?
如果同时删除两个员工文档会发生什么?
函数被调用两次,这意味着该值会减少两次。这也意味着你必须为两次写作付费。
只要我在使用消防用品,我就可以安全地避免双重消费吗。FieldValue.increment,而不是将当前值读取到云函数的RAM中,然后从那里写入更新的(可能过时的(值?
如果使用增量,则保存两次读取。因为如果你想先读它们,然后递增,你必须支付两次读和两次写的费用。
如果需要对字段进行的更改涉及到比简单地递增更多的计算,那该怎么办?如何在确保在读取字段的相同旧值后,多个会话不会同时修改同一字段的情况下进行更改?
在这种情况下,您需要使用一个事务,它可以确保您始终拥有一致的数据,无论执行多少并发增量操作。