无需阅读即可批量更新Firebase

问题描述 投票:0回答:1

我有一个案例,我需要更新一个集合中所有文档的一个字段,我正在通过批量更新来做到这一点,但是,我目前使用的方法是首先让我阅读所有文档文件,这是没有必要的。

我只想更新我的用户集合,所有用户都有一个名为

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();

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

node.js google-cloud-firestore firebase-admin
1个回答
0
投票

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

关于Admin SDK,请注意允许使用

select()
指定您想要的字段。函数的名称可能因一种编程语言而异。

如果您使用的是 Node.js,请检查以下答案:

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

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

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

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

解决此问题的方法是将文档 ID 存储在 Firebase 实时数据库 中,它具有不同类型的计费机制。那里没有阅读。

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

© www.soinside.com 2019 - 2024. All rights reserved.