【问题标题】:Firebase batch update without reading无需阅读的Firebase批量更新
【发布时间】:2023-02-23 15:07:41
【问题描述】:

我有一个案例,我需要更新集合中所有文档的字段,我正在通过批量更新来执行此操作,但是,我目前使用的方法是首先让我阅读所有文档,那是没有必要的。

我只想更新我的用户集合,所有用户都有一个名为 credits 的字段,我想使用该功能重置每个人的积分,这有效:

const usersRef = await firebaseAdmin.firestore().collection("users").get();

const batchCreditsReset = firebaseAdmin.firestore().batch();

usersRef.docs.forEach(doc => {
  batchCreditsReset.update(doc.ref, { credits: 1000 });
});

await batchCreditsReset.commit();

但是,如果不先阅读整个系列,我该怎么做呢?我不需要阅读它,因为我已经知道我想将值设置为什么,并且不依赖于任何当前值。

【问题讨论】:

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


    【解决方案1】:

    无需阅读文档即可对其进行更新。您必须做的是创建一个精确指向该文档的引用,然后调用 update()。这意味着您必须提前知道文档 ID 才能执行更新。

    但是,如果您需要更新整个集合,那么在执行更新之前您必须知道所有现有文档的 ID。您可以通过读取所有文档、提取 ID 并执行更新来完成此操作,也可以将所有文档 ID 存储在文档中的数组类型的字段中。要更新所有文档,您只需阅读单个文档、创建文档引用并执行更新。通过这种方式,您只需为单次阅读付费,而无需为等于您收藏中现有文档数量的阅读次数付费。该解决方案适用于包含合理数量文档的集合。

    因此,如果您决定使用上述解决方案,请注意在可以放入文档的数据量方面存在一些限制。根据关于usage and limits的官方文档:

    文档的最大大小:1 MiB(1,048,576 字节)

    如您所见,单个文档中的数据总量不得超过 1 MiB。当我们谈论存储字符串(文档 ID)时,您可以存储很多东西。我怀疑您是否会达到限制,但随着您的数组变大,请注意此限制。还要记住的另一件事是,您必须始终保持文档最新,这意味着如果将文档添加到集合中,则必须使用新 ID 更新数组,删除文档时也是如此。最简单的解决方案是使用Cloud Functions for Firebase

    解决方法是将文档 ID 存储在 Firebase Realtime Database 中,它具有不同类型的 billing mechanism。那里没有涉及读取。

    因此,由您决定哪种解决方案最适合您的应用程序。

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2019-01-20
      • 2017-03-23
      • 1970-01-01
      相关资源
      最近更新 更多