Firebase firestore安全规则中的更新字段数

Firebase firestore安全规则中的更新字段数,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我正在从客户端执行批处理操作,以仅更新一个字段,但在执行批处理操作和在安全规则中进行测试时,发现有多个字段正在更新。我使用request.resource.data.size()>1和request.resource.data.keys().size()>1返回true(文档正在更新),但这并不是为了在安全规则中检查只有一个字段正在使用request.resource.data.keys()之类的检查进行更新(['someFieldToUpdate'])但这现在不起作用,以前我记得有writeF

我正在从客户端执行批处理操作,以仅更新一个字段,但在执行批处理操作和在安全规则中进行测试时,发现有多个字段正在更新。我使用
request.resource.data.size()>1
request.resource.data.keys().size()>1
返回
true
(文档正在更新),但这并不是为了在安全规则中检查只有一个字段正在使用
request.resource.data.keys()之类的检查进行更新(['someFieldToUpdate'])
但这现在不起作用,以前我记得有
writeFields
来检查这一点,但它现在在文档中不存在,而且回答中也提到了它。那么我如何检查那些实际上正在批处理操作中更新的字段呢?

request.resource.data
字段包含在写入操作成功后删除资源。由于无法始终可靠地填充
writeFields
属性,因此已删除该属性

现在我能想到的唯一选择是检查每个字段是否已更改,然后仅在有一个更改时才允许更改。但老实说,这听起来像是一个奇怪的用例。我看到的一个更常见的用例是限制用户可以更新哪些特定字段,而不是一次可以更新多少个字段。

您可以在其上使用新方法数据映射。它告诉您更改了哪些键。下面是一个示例:

function isUpdateToOpenField(attr) {
    return request.resource.data.diff(resource.data).changedKeys().hasOnly(['open']);
}

allow update: if isUpdateToOpenField(request.resource.data);

改编自。

我确实希望用户更新一个“特定”字段,而不是我正在使用request.resource.data.keys().hasOnly(['someFieldToUpdate'])检查的任何其他字段,我举了一个关于字段数量的例子,只是为了说明request.resource.data中的键比从客户端实际更新的键多。现在我知道request.resource.data告诉我们写操作后文档的状态。所以总结起来,检查是否只更新了一个特定字段的唯一方法是检查他们是否已更改,并根据更改做出决定。事实上,这是正确的。您必须检查所有这些字段是否
request.resource.data.field==resource.data.field
。这太痛苦了,因为该文档有10多个字段,并且还有子对象,所以检查子对象的相等性不是件容易的事可能的原因是子对象中的键根据其他逻辑而变化。我能看到的唯一方法是使用云函数,如果更改不满足条件,则恢复到以前的状态。我错过了
writeFields
:P@FrankvanPuffelen如果你有一个复杂的对象,这尤其困难nt,其中我希望用户只更新名称。它内部有多个映射,由云函数写入用户文档,我不希望更新这些映射。在安全规则中,我无法检查映射是否相等,因为键不是固定的,值是对象。我修复此问题的唯一方法是编写一个ch只接受一个名称并更新用户文档中的名称。如果我可以在这里使用安全规则,那就太好了。