【问题标题】:Firestore document sharing without scanning entire collection无需扫描整个集合即可共享 Firestore 文档
【发布时间】:2019-07-23 10:07:01
【问题描述】:

我正在学习我的 Firestore 基础知识并尝试构建一个应用程序,允许 user1 与 user2/3/4 等共享文档。

出于计费目的,导致文档读取的每个查询都计入成本。因此,我不想遵循将 user2/3/4 等电子邮件添加到“sharedWith”变量以键入:数组或映射类型结构的方法,因为我相信每个用户都必须扫描整个集合并选择显示他们的电子邮件的文档。

还有其他方法可以让 user1 以编程方式访问某个特定文档的 user2/3/4 吗?

【问题讨论】:

    标签: android firebase nosql google-cloud-firestore


    【解决方案1】:

    出于计费目的,导致文档读取的每个查询都计入成本。

    这是正确的,根据有关Cloud Firestore billing的官方文档:

    对于您执行的每个查询,即使查询没有返回任何结果,也需要读取一个文档的最低费用。

    因此,即使您的查询没有返回任何结果,您也需要为阅读一份文档付费。

    我相信每个用户都必须扫描整个集合并选择出现电子邮件的文档。

    这也是正确的。因此,让我们假设您要查找的电子邮件地址存在于属于 10k 文档集合的文档中。因此,如果您仅针对该特定文档查询数据库,您将被收取只读取一个文档而不是那些10k。因此,您需要根据您返回的项目数量而不是您请求它们的项目数量来收费。当您从 Firebase 服务器获取数据时,这可用于第一个请求。如果同时没有任何变化,第二次从缓存中获取数据,因为 Firestore 默认启用了offline persistence。这意味着您无需为任何其他文档读取付费。

    还有其他方法可以让 user1 以编程方式访问某个特定文档的 user2/3/4 吗?

    如果不将数据写入数据库,则没有。因此,您应该将 id 或电子邮件地址添加到所需的文档并根据它执行查询。

    【讨论】:

    • 只是为了我的具体理解,当你说 - “......所以如果你只为那个特定的文档查询数据库,你将只需要阅读一份文档而不是那些 10k” - 你的意思是如果我运行查询,而不提供文档编号,并在“sharedWith”变量中询问任何带有 user2 电子邮件的文档,即使必须扫描 10k 个文档,也只会算作一次阅读(如果只有一个文档存在)为此
    • 是的,没错。因此,如果您运行 collectionRef.whereArrayContains("sharedWith", "name@gmail.com") 之类的查询,并且此特定电子邮件地址存在于单个文档中,则您只需支付单个读取操作的费用。你现在清楚了吗?
    • 是的!感谢您的澄清。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多