【问题标题】:Firestore rules: Check which array element is removedFirestore 规则:检查删除了哪个数组元素
【发布时间】:2019-04-01 04:33:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    回答你的问题:

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

    不,你不能!

    【讨论】:

    • 一切都好吗,我可以帮助您了解其他信息吗?
    • 所以我在问这个问题,因为我正在考虑我的 Firebase 应用程序的结构,用户可以在其中添加朋友。由于客户端唯一需要的是获取朋友 uid,因此我目前正在为每个用户使用一个“朋友”文档,其中 uid 存储在数组中。但是,这并不是 Firestore 规则系统的最佳解决方案。另一方面,我不希望每个朋友都有一个文档,因为数据每次都需要保持新鲜,并且当另一个用户想要查看特定用户的所有朋友时,我正在保存读取。有没有更好的方法来做到这一点?
    • 没有更好或更正确的方法。关于您的最后一个问题,请参阅我在 post 的回答,以便更好地理解。
    • 如果您认为我的回答/评论也能帮助未来的访客,也请考虑投票。我会很感激的。谢谢!
    【解决方案2】:

    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. 第三条规则减去新数组(现在减少了 1 个uid)与 removeAll() 的旧数组并返回一个数组及其差异。在这种情况下,它返回一个数组,其中仅包含您选择的单个uid arrayRemove()。然后我们简单地检查uid——它只能存在于[0]位置——并确保它等于经过身份验证的用户的uid

    【讨论】:

    • 我们在哪里可以找到此类操作的文档?有一个关于 Firestore 规则的语言参考会很好,但我真正能找到的只是一个用散文写的模糊指南......!
    • @EdHinchliffe 我能感觉到你,不幸的是我不知道有什么资源比 stackoverflow 更好。每当官方文档失败时,这是我的首选之地,希望某些用户遇到同样的问题并设法解决它并以简洁的方式编写它。这就是我最初偶然发现这篇文章的原因,正在寻找答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多