【问题标题】:Decrease document reads in Firestore, react app减少 Firestore 中的文档读取,响应应用程序
【发布时间】:2021-11-12 22:37:20
【问题描述】:

我正在使用 Firebase Firestore 作为后端数据库构建一个聊天应用程序。

我在 useEffect hook as 中收到了最近 25 条消息

useEffect(() => {
    const q = query(
        collection(db, 'messages'),
        orderBy('createdAt', 'desc'),
        limit(25)
    );

    return onSnapshot(q, (snapshot) => {
        setData(
            snapshot.docs.map((doc) => {
                console.log('document read');
                return { ...doc.data(), id: doc.id };
            })
        );
    });
}, []);

但此操作会导致在页面加载时读取 25 次文档,并在发送消息时额外读取 50 次。 如果连接了更多用户,则每个用户会在任何用户发送的单个消息上发生 25 个请求。 有什么办法可以减少读取?

完整代码:-https://github.com/Puneet56/Converse

【问题讨论】:

    标签: reactjs firebase google-cloud-firestore


    【解决方案1】:

    如果您在其中获得一个新的结果,那么您不会在运行的查询中获得 25 次读取,限制为 25 个结果。正如documentation 所说:

    当您收听查询结果时,您需要为阅读付费 每次添加或更新结果集中的文档时。你是 当从结果集中删除文档时,还收取读取费用 因为文件变了。 (相反,当一个文档是 已删除,您无需为阅读付费。)

    此外,如果监听器断开连接超过 30 分钟(对于 例如,如果用户离线),您将被收取阅读费用 如果您发出了全新的查询。

    如文档中所述,您只需为 added 和超出查询限制的邮件收取费用,因为有新邮件进入。因此,每条新邮件您可能只能获得 2 次阅读。我认为这是一个合理的数额。我无法在聊天应用程序中减少此金额。即使您增加查询限制,只有初始 reads(如果它是没有旧缓存或空缓存的新读取)会增加,但收听时的读取将保持不变。

    【讨论】:

    • 我重新加载了应用程序 4 次(100 次读取),并且在使用选项卡中增加了相同的值。然后我发送了 4 条消息,使用量再次增加了 100。它为每个阅读的文档收费。消息未存储在本地,因为它们必须实时更新。
    • 重新加载页面意味着所有内存都被清除,数据库必须再次加载 25 个文档。但是在页面保持打开状态时发送消息只会增加一个文档读取费用。如果您还想减少页面加载之间的文档读取费用,请enabled offline persistence 为客户端。
    • 也许我应该在应用加载时在本地存储一些特定消息,并使用 limit(1) 设置监听器。
    • 即使您这样做并且只更改了一个文档,您仍然会读取一个用于添加新文档和一个用于从该限制中删除旧文档的读取 (1)。再次明确:你不能做任何比现在更好的事情。您可以按照@FrankvanPuffelen 的说明启用离线功能,以改善离线行为并在某些情况下保存读取。但是在聊天中有实时监听器时的读取量不会改变。
    • @TarikHuber 不在查询中的文档不会导致文档读取费用。因此,如果在您有活动侦听器的情况下添加新文档,则会产生单个文档读取费用。
    猜你喜欢
    • 2023-02-21
    • 1970-01-01
    • 2021-04-04
    • 2021-11-23
    • 2019-06-26
    • 2019-07-04
    • 2021-06-08
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多