【问题标题】:Firestore get document except some fields [duplicate]Firestore获取文档,但某些字段除外[重复]
【发布时间】:2021-01-27 13:46:23
【问题描述】:

我想从 Firestore 获取文档,但只是包含文档的某些字段。

我为此找到了 2 个用例。其中之一是:

Firestore 中的用户

UsersCollection
     UserDocument
           email
           uid
           photoUrl
           name

如果我想与用户集合中的所有用户聊天,我需要获取用户集合中的所有文档。但是这些文档包含一些对我们的聊天无用的重要信息,例如电子邮件。我不能只从 firebase 请求没有电子邮件字段的用户文档吗?黑客不能在内存中找到用户文档并获取他们的电子邮件吗?电子邮件对聊天没有用,我只需要姓名,uid 和 photoUrl,电子邮件对这个功能没有用,但我仍然可以使用整个文档。 我如何在没有电子邮件的情况下“排除”或获取文档?这更多的是关于安全性和用户隐私。

另一个用例是类似系统。假设我们在 firebase 中有一个类似这样的帖子:

    PostsCollection
        PostDocument
            number of likes
            arrayOfUsersThatLiked
            photoUrl

点赞数由云函数递增,当修改arrayOfUsersThatLiked时,该函数将数组的长度添加到点赞数字段中。 (arrayOfUsersThatLiked 用于不让用户点赞超过 1 次,所以如果有人点赞该帖子,arrayOfUsersThatLiked 会跟踪谁,不会让他们再次点赞)

当我们从数据库中获取帖子文档时,我们实际上会得到包含很多 uid 的 usersThatLiked 数组以及我们需要的东西,我们只需要 photoUrl 和帖子上的点赞数,而不需要 usersThatLiked大批。 (存储这么大的字符串数组也很痛苦)。

所以主要问题仍然存在,我如何仅获取包含我想要的字段的文档?这是隐私/安全和性能问题。

【问题讨论】:

    标签: arrays firebase google-cloud-firestore database-design firebase-security


    【解决方案1】:

    使用客户端 SDK(包括 FlutterFire 插件)无法仅获取文档字段的子集。当你获取一个 Document 时,你会得到它的所有字段。

    以下是三种可能的方法:

    1. Dernomalize 您的数据:您创建另一个集合,其中包含仅包含您希望在前端显示的字段的文档。复杂之处在于您需要使两个集合保持同步:当您在主集合中创建/修改/删除一个文档时,您需要更新另一个集合。这可以从您的前端完成(例如,您在批量写入中写入两个集合)或使用云函数,在后端使用onWrite 触发器触发。在安全性方面,您只对第二个集合开放读取访问权限,而不是对主集合开放。

    2. 使用Firestore REST API:使用 REST API,您可以在获取文档时使用 DocumentMask,这将“将文档上的获取操作限制为其字段的子集。”。但是请注意,“黑客”可以获取集合 ID 并在没有掩码的情况下获取文档。

    3. 使用云函数访问 Firestore 文档。使用云函数,您可以完全控制要发送回前端的内容,因为您从云函数中查询集合并在云函数中构建响应。但是,使用 Cloud Function 而不是 Client SDK 有几个缺点:请参阅article 了解更多详细信息。

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多