NodeJS Firebase批量更新,无需阅读

bf1o4zei  于 2023-03-01  发布在  Node.js
关注(0)|答案(1)|浏览(162)

我有一个案例,我需要更新集合中所有文档的一个字段,并且我使用批处理更新来完成此操作,但是,我目前使用的方法是首先让我读取所有文档,这是不必要的。
我只想更新我的用户集合,所有用户都有一个名为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();

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

uajslkp6

uajslkp61#

更新文档时不需要读取文档。您需要做的是创建一个引用,精确指向该文档,然后调用update()。这意味着您必须提前知道文档ID才能执行更新。
当涉及到Admin SDK时,请注意,它允许指定您想要使用select()的字段。函数的名称可能会因编程语言而异。
例如,如果您使用的是Node.js,请检查下面的答案:

但是,如果您需要从客户端SDK更新整个集合,则在执行更新之前必须知道所有现有文档的ID。您可以通过阅读所有文档、提取ID并执行更新来完成此操作,也可以将文档中的所有文档ID存储在类型为数组的字段中。要更新所有文档,您只需读取单个文档,创建文档引用并执行更新。这样,您只需支付单次读取的费用,而不必支付与集合中存在的文档数量相等的多次读取的费用。此解决方案适用于包含合理数量文档的集合。
因此,如果您决定使用上面的解决方案,请注意,对于文档中可以放入的数据量有一些限制。根据usage and limits的官方文档:
文档的最大大小:1兆字节(1,048,576字节)
正如您所看到的,单个文档中的数据总量被限制为1 MiB。(文档ID),你可以存储很多东西。我怀疑你是否会达到这个限制,但是随着你的数组变得越来越大,要小心这个约束。还有一件事要记住,你必须总是保持文档最新,这意味着如果一个文档被添加到集合中,你必须用新的ID更新数组,就像你删除一个文档一样,最简单的解决方案是使用Cloud Functions for Firebase
一种解决方法是将文档ID存储在Firebase Realtime Database中,Firebase Realtime Database具有不同类型的billing mechanism,其中不涉及读取。
因此,由您来决定哪种解决方案最适合您的应用程序。

相关问题