【问题标题】: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。那里没有涉及读取。
因此,由您决定哪种解决方案最适合您的应用程序。