firebase - Cloud Firestore 安全规则中的 MapDiff 是什么?

标签 firebase google-cloud-firestore firebase-security

关闭。这个问题需要更多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.dataresource.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.removedKeysMapDiff.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.unchangedKeysMapDiff.changedKeys相反并返回一组在两个映射之间未更改的所有键,即所有带有 的键等于 值(value)观:

{'cakes': 0}.diff({'cakes': 0}).unchangedKeys() == ['cakes'].toSet() // true

关于firebase - Cloud Firestore 安全规则中的 MapDiff 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60607241/

相关文章:

javascript - 当手机屏幕锁定时,我的 JavaScript 代码停止运行?

java - 如何在应用程序启动时使用 recyclerview 加载 fragment ?

firebase - Firestore 离线 promise 处理?

firebase - 我无权访问 firestore 安全规则中的自定义声明

android - OrderByKey 工作正常,但 OrderByChild 在 firebase 实时数据库中给出了意想不到的结果

javascript - 当我在 Firebase 中找到我想要获取的数据时,如何停止 forEach?

firebase - Firestore 安全规则 - 如何防止修改某个字段

Firebase 实时数据库规则 : Validation is cascading to child. 如何忽略父节点上的 .validate?

firebase - 使用 Firebase 托管部署 Vue.js 应用程序

java - Firestore创建集合而不添加任何文档