我正在从客户端进行批处理操作,以仅更新一个字段,但是在进行批处理操作并在安全性规则中进行测试时,发现正在更新多个字段。我使用request.resource.data.size() >1
和request.resource.data.keys().size()>1
并返回了true
(正在更新文档)进行了检查,但这并不是要这样做,因为我想检查安全规则,即使用{ {1}},但是现在不起作用,以前我记得有request.resource.data.keys().hasOnly(['someFieldToUpdate'])
可以检查,但是现在文档中没有它,this答案也提到了。那么,如何在批处理操作中现在检查实际上正在更新的字段?
答案 0 :(得分:6)
您可以在数据地图上使用新的diff()方法。它告诉您更改了哪些键。这是一个示例:
function isUpdateToOpenField(attr) {
return request.resource.data.diff(resource.data).changedKeys().hasOnly(['open']);
}
allow update: if isUpdateToOpenField(request.resource.data);
改编自this answer。
答案 1 :(得分:2)
request.resource.data
字段包含成功执行写操作后将存在的资源。由于无法始终可靠地填充writeFields
属性。
现在,我唯一想到的选择是检查每个单独的字段是否已更改,然后仅在有一个更改的情况下才允许更改。但老实说,这听起来像是一个奇怪的用例。我看到了一个更常见的用例,它限制了用户可以更新的 个特定字段,而不是一次可以更新多少个。