【发布时间】:2019-04-01 04:33:08
【问题描述】:
是否可以检查请求删除/添加文档数组的哪个元素?
【问题讨论】:
标签: firebase google-cloud-firestore firebase-security
是否可以检查请求删除/添加文档数组的哪个元素?
【问题讨论】:
标签: firebase google-cloud-firestore firebase-security
您可能已经注意到,Cloud Firestore 中的查询速度非常快,这是因为 Firestore 会自动为您文档中的任何字段创建一个索引。
有很多帖子说数组在 Cloud Firestore 上无法正常工作,因为当您拥有可以被多个客户端更改的数据时,很容易混淆,因为您不知道发生了什么以及发生在哪个特定领域。如果您使用Map 并且用户想要编辑几个不同的字段,即使是完全相同的字段,我们通常都知道发生了什么。在数组中,情况有所不同。试着想想如果一个用户想要编辑索引 0 处的值,其他用户想要删除索引 0 处的值,同时另一个用户想要在索引 1 处添加另一个值,你最终会发生什么结果非常不同,为什么不呢,ArrayIndexOutOfBoundsException。所以带有数组的 Firestore 操作有点不同。因此,您无法在特定索引处执行诸如插入、更新或删除之类的操作。因此,只有在不关心存储元素的确切顺序时才使用数组。 Firestore 几天前添加了一些功能来添加或删除特定元素,但前提是不关心它们的确切位置。见here官方文档。
回答你的问题:
是否可以检查请求删除/添加文档数组的哪个元素?
不,你不能!
【讨论】:
2020 年更新
您现在实际上可以检查已删除的项目。您所要做的就是用removeAll() 从旧数组中减去新的、缩减的数组,然后检查它返回的数组的项目。
例如,只允许从数组中删除自己的uid,您可以这样做:
allow update: if
request.auth.uid != null
&& request.resource.data.users.size() == resource.data.users.size() - 1
&& resource.data.users.removeAll(request.resource.data.users)[0] == request.auth.uid
具体来说:
uid)与 removeAll() 的旧数组并返回一个数组及其差异。在这种情况下,它返回一个数组,其中仅包含您选择的单个uid arrayRemove()。然后我们简单地检查uid——它只能存在于[0]位置——并确保它等于经过身份验证的用户的uid。【讨论】: