Firebase 是否有writeFields的替代方案?

Firebase 是否有writeFields的替代方案?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,声明“[writeFields]现在已弃用”。 此外,我找不到任何有关writeFields的文档,它甚至不再作为文档的一部分列出 问题 我在云Firestore安全规则方面面临的问题是,验证是否只修改了特定字段需要大量的条件。 例如,如果要验证文档的唯一修改值是否为cakes,则必须编写以下规则: 允许更新:if request.resource.data.size()==20 &&request.resource.data.likes==resource.data.likes &&reque

声明“[writeFields]现在已弃用”。
此外,我找不到任何有关
writeFields
的文档,它甚至不再作为文档的一部分列出

问题 我在云Firestore安全规则方面面临的问题是,验证是否只修改了特定字段需要大量的条件。
例如,如果要验证文档的唯一修改值是否为
cakes
,则必须编写以下规则:

允许更新:if request.resource.data.size()==20
&&request.resource.data.likes==resource.data.likes
&&request.resource.data.name==resource.data.name
&&request.resource.data.date==resource.data.date
&&request.resource.data.body==resource.data.body
&&request.resource.data.title==resource.data.title
&&request.resource.data.tags==resource.data.tags
&&request.resource.data.comments==resource.data.comments
&&request.resource.data.answers==resource.data.answers
&&request.resource.data.awards==resource.data.awards
&&request.resource.data.image==resource.data.image
&&request.resource.data.link==resource.data.link
&&request.resource.data.format==resource.data.format
&&request.resource.data.type==resource.data.type
&&request.resource.data.user==resource.data.user
&&request.resource.data.views==resource.data.views
&&request.resource.data.reports==resource.data.reports
&&request.resource.data.roles==resource.data.roles
&&request.resource.data.category==resource.data.category
&&request.resource.data.voces==resource.data.voces
&&request.resource.data.cakes为int;
使用
writeFields
,与完全相同的规则如下所示:

允许更新:if request.writeFields.hasOnly(['cakes')&&request.resource.data.cakes为int;
我可以做些什么来减少规则的代码大小/除了
writeFields
,还有什么替代方法

限制 文档中提到的两个问题使此问题更加严重:

  • 每个请求计算的最大表达式数:1000

  • 规则集的最大大小:64 KB


我希望通过这个限制在某个时候达到这两个目标。

不幸的是,你现在所做的是目前你最好的选择


Firebase规则团队正在进行语言改进,以使比较/diff映射类型对象更容易,这将大大减少执行此类操作所需的表达式数量,但目前还没有时间表。请继续收看。

是的!现在有一个替换名为“地图差异”。请检查以下语法:

allow update: if request.resource.data.diff(resource.data).affectedKeys().hasOnly(['cakes']) 
              && request.resource.data.cakes is int;

我最终编写了以下帮助函数:

//如果数组参数中包含所有更改的字段,则返回true
仅函数LowedFields(fieldsArray){
返回字段array.toSet().hasAll(request.resource.data.diff(resource.data.affectedKeys());
}
//如果未更改任何字段,则返回true
函数noneOfDisallowedFields(fieldsArray){
return request.resource.data.diff(resource.data).affectedKeys().hasAny(fieldsArray.toSet())==false
}
我发现这种方法比使用hasOnly()更有用,因为hasOnly()要求所有可以更改的字段都必须已更改