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

时间:2018-10-27 18:53:31

标签: firebase google-cloud-firestore firebase-security

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

2 个答案:

答案 0 :(得分:5)

UPDATE 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

特别是:

  1. 第一个规则检查用户身份验证
  2. 第二个规则确保新数组比旧数组短1个项目(以便一次只能删除1个项目)
  3. 第三个规则uid从旧数组减去新数组(现在减少了1 removeAll()),并返回它们之间的差值。在这种情况下,它将返回一个数组,该数组仅包含您选择uid的单个arrayRemove()。然后,我们只需检查uid(只能存在于位置[0]处),并确保它等于已验证用户的uid

答案 1 :(得分:1)

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

那里有很多帖子说数组在Cloud Firestore上不能很好地工作,因为当您拥有可以被多个客户端更改的数据时,很容易感到困惑,因为您不知道发生了什么以及在哪发生了什么特定领域。如果您使用的是Map,并且用户想要编辑几个不同的字段,甚至是完全相同的字段,我们通常都知道发生了什么。在数组中,情况有所不同。试想一下,如果一个用户想要编辑索引0处的值,而另一个用户想要删除索引0处的值,而另一个用户想要在索引1处添加另一个值,那会发生什么?结果截然不同,ArrayIndexOutOfBoundsException为何呢?因此,带有数组的Firestore操作有点不同。因此,您无法在特定索引处执行诸如插入,更新或删除之类的操作。因此,仅在不关心存储元素的确切顺序时才使用数组。 Firestore几天前添加了一些功能来添加或删除特定元素,但前提是不关心它们的确切位置。请参阅here官方文档。

并回答您的问题:

  

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

不,你不能!