Firestore 规则:检查删除了哪个数组元素

ktm*_*125 3 firebase firebase-security google-cloud-firestore

是否可以检查请求删除/添加文档数组的哪个元素?

小智 8

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
Run Code Online (Sandbox Code Playgroud)

具体来说:

  1. 第一条规则检查用户身份验证
  2. 第二条规则确保新数组恰好比旧数组短 1 个项目(这样一次只能删除 1 个项目)
  3. 第三条规则旧数组中减去新数组(现在减少了 1 uid),removeAll()并返回一个数组及其差值。在这种情况下,它返回一个只包含uid您选择的单曲的数组arrayRemove()。然后我们简单地检查uid——它只能存在于位置[0]——并确保它等于uid经过身份验证的用户的。


Ale*_*amo 1

您可能已经注意到,Cloud Firestore 中的查询速度非常快,这是因为 Firestore 会自动为文档中的任何字段创建索引。

有很多帖子说数组在 Cloud Firestore 上效果不佳,因为当您拥有可由多个客户端更改的数据时,很容易感到困惑,因为您不知道正在发生什么以及在哪个特定字段上。如果您正在使用 aMap并且用户想要编辑多个不同的字段,甚至是完全相同的字段,我们通常都知道发生了什么。在数组中,情况有所不同。尝试想想如果一个用户想要编辑索引 0 处的值,其他一些用户想要删除索引 0 处的值,同时另一个用户想要在索引 1 处添加另一个值,那么会发生什么,你最终会发生什么有非常不同的结果,为什么不呢,一个ArrayIndexOutOfBoundsException。因此,Firestore 与数组的操作略有不同。因此您无法在特定索引处执行插入、更新或删除等操作。因此,仅当不关心存储元素的确切顺序时才使用数组。Firestore 几天前添加了一些功能来添加或删除特定元素,但前提是不关心它们的确切位置。请参阅此处官方文档。

并回答你的问题:

是否可以检查请求删除/添加文档数组的哪个元素?

你不能!