firebase - 子集合的 Cloud Firestore 规则

标签 firebase firebase-security google-cloud-firestore

我正在开发一个具有(哇哇惊喜!)聊天功能的 iOS 应用程序。整个应用程序大量使用 Firebase 工具,对于数据库,我使用的是新的 Cloud Firestore 解决方案。

目前,我正在使用数据库规则加强安全性,但我在使用自己的数据模型时遇到了一些困难:) 这可能意味着我的数据模型选择不当,但我对此非常满意,除了实现规则部分。

模型的对话部分如下所示。在我的数据库的根目录下,我有一个 conversations收藏:

/conversations/$conversationId
        - owner // id of the user that created the conversation
        - ts // timestamp when the conversation was created
        - members: {
                $user_id_1: true // usually the same as 'owner'
                $user_id_2: true // the other person in this conversation
                ...
          }
        - memberInfo: {
                // some extra info about user typing, names, last message etc.
                ...
          }

然后我在每个对话中都有一个子集,名为 留言 .消息文档是一个非常简单的文件,仅包含有关每个已发送消息的信息。
/conversations/$conversationId/messages/$messageId
        - body
        - sender
        - ts

以及模型的截图:
the model

上的规则对话 文档相当简单且易于实现:
match /conversations/{conversationId} {
  allow read, write: if resource.data.members[(request.auth.uid)] == true;

  match /messages/{messageId} {
        allow read, write: if get(/databases/$(database)/documents/conversations/$(conversationId)).data.members[(request.auth.uid)] == true;
  }
}

问题

我的问题是该对话中的消息子集合。以上有效,但我不喜欢使用 get()在那里打电话。
每个get() call 执行读取操作,因此会影响我月底的帐单,请参阅 documentation .

...

如果我正在构建的应用程序成功,这可能会成为一个问题,当然读取的文档确实很少,但是每次用户打开对话时都这样做似乎有点低效。我真的很喜欢我模型中的子集合解决方案,但不确定如何有效地实现这里的规则。

我对任何数据模型更改持开放态度,我的目标是在没有这些的情况下评估规则 get()调用。任何想法都非常受欢迎。

最佳答案

老实说,我认为你对你的结构没问题,get按原样调用。原因如下:

  • 如果您要获取子集合中的一堆文档,Cloud Firestore 通常足够智能,可以根据需要缓存值。例如,如果您要求获取“conversions/chat_abc/messages”中的所有 200 个项目,Cloud Firestore 只会执行一次该获取操作,并在整个批处理操作中重复使用它。所以你最终会得到 201 次读取,而不是 400 次。
  • 作为一般哲学,我不喜欢优化安全规则中的定价。是的,您最终可能会为每个操作多读一两次,但它可能不会以同样的方式给您带来麻烦,例如,编写不当的云函数可能会。这些是您最好进行优化的领域。
  • 关于firebase - 子集合的 Cloud Firestore 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47809552/

    相关文章:

    javascript - 在云函数中获取文档值

    java - 在一定条件下从firebase数据库中检索数据

    java - 是否可以在应用程序已运行的情况下从客户端生成对象/模型类

    具有 facebook 身份验证和唯一 ID 的 Firebase 规则

    firebase - 如何为 CI 创建 Firebase 测试环境?

    firebase - Firestore.getInstance() : how to use?

    java - 在 Java 中解码 Firebase token

    ios - 遍历Firebase中节点中的所有节点

    javascript - 让客户端创建用户但在通过身份验证之前不修改

    firebase - 如何在 Firebase 中设置 IP/域安全规则?