关闭。这个问题需要更多focused .它目前不接受答案。
想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .
去年关闭。
Improve this question
我听说了一个新的 MapDiff
Cloud Firestore 安全规则中的功能。
我想用它来更有效地解决problem described here ,即避免必须写出以下内容:
allow update: if request.resource.data.size() == 6
&& 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.cakes is int;
过去,
writeFields
存在,但它们是 unsupported now .我如何有效地(关于代码简洁性)检查是否只有一个字段被更改并使用
MapDiff
一般来说?
最佳答案
TL; 博士
allow update: if request.resource.data.diff(resource.data).affectedKeys().hasOnly(['cakes'])
&& request.resource.data.cakes is int;
MapDiff
解释rules.MapDiff
是最近添加到 Cloud Firestore 安全规则的一项强大功能,是比较两个 Map
的有效方法。对象。自
request.resource.data
和 resource.data
是 map ,MapDiff
是完美的。Map.diff()
为了使用任何
MapDiff
功能,您首先必须调用 diff
在你的 map 上。这很容易,看起来像这样:request.resource.data.diff(resource.data) // Now you have a MapDiff object!
affectedKeys
MapDiff.affectedKeys
函数是最有用的,因为它结合了 addedKeys
, removedKeys
, 和 changedKeys
.这意味着 affectedKeys
是什么将解决原始问题的问题。这意味着所有:
allow update: if request.resource.data.size() == 6
&& 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.cakes is int;
变成只是:
allow update: if request.resource.data.diff(resource.data).affectedKeys().hasOnly(['cakes'])
&& request.resource.data.cakes is int;
所以
affectedKeys
返回 rules.Set
两个映射之间受影响的所有键,即添加、删除或更改。addedKeys
这以同样的方式工作
affectedKeys
确实,现在只返回一个带有添加键的集合。{'cakes': 1}.diff({}).addedKeys() == ['cakes'].toSet() // true
removedKeys
MapDiff.removedKeys
与MapDiff.addedKeys
相反并返回一组仅在两个映射之间删除的键:{}.diff({'cakes': 1}).removedKeys() == ['cakes'].toSet() // true
changedKeys
MapDiff.changedKeys
返回 Set
在两个映射之间更改的所有键中:{'cakes': 0}.diff({'cakes': 1, 'pies': 4}).changedKeys() == ['cakes'].toSet() //true
每当两组中的值都不是 时,就会发生变化。等于 .
unchangedKeys
MapDiff.unchangedKeys
与MapDiff.changedKeys
相反并返回一组在两个映射之间未更改的所有键,即所有带有 的键等于 值(value)观:{'cakes': 0}.diff({'cakes': 0}).unchangedKeys() == ['cakes'].toSet() // true
关于firebase - Cloud Firestore 安全规则中的 MapDiff 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60607241/