我有一个名为 schools 的文档集合,为此我们保留了名为 createdAt 和 updatedAt 的字段。我将分别在onCreate和onUpdate触发器中使用firestore云触发器函数更新这些字段。
我在这里面临的问题是,这些字段更新将不必要地再次调用onUpdate触发器。为了处理这些问题,我编写了一个名为 skipOnUpdateTrigger
的附加函数。const excludeFields = ["createdAt", "UpdatedAt"]
shouldSkipOnUpdateTrigger = function(docDataOld, docDataNew, excludeFields){
for(let i of excludeFields){
if (docDataOld[i] !== docDataNew[i])
return true;
}
return false;
}
有什么更好的方法可以处理这种情况,从而避免那些额外的触发因素?
答案 0 :(得分:1)
我认为您的想法正确。您必须比较快照前后的快照,以确保在实际要修改时间戳的位置发生了更新。无法知道更改是如何发生的(可能是客户端还是服务器),因此您必须查看数据本身。
答案 1 :(得分:1)
我发现的最简单的方法是完全避免对Cloud Functions的需求,并让客户端在每次写入时使用server-side timestamp包含lastUpdated
值。
您可以通过以下方法在安全规则中强制执行此操作:
allow update: if request.resource.data.lastUpdated = request.time