删除 Firebase 实时数据库中的数百万个字段

Delete millions of fields in Firebase Realtime Database

我必须删除不同位置的多个字段。 我有 数百万 条包含多个字段的“消息”,例如:

messagesId: {
    text: "...",
    datetime: "...",
    unusedField: "...", <-- REMOVE
    ...
}, ...

为了节省存储空间 space,我想为每条消息删除旧的和未使用的字段。这意味着,节省数十 Giga,别名钱(我们目前支付的数百美元,因为除了 Firebase 保证的第一个 GB)。

问题 #1 - 数据库峰值: 以编程方式删除大量数据,将峰值设置为 100%,暂时阻止它。 为了解决这个问题,Firebase 支持建议的解决方案是使用 CLIfirebase 数据库:删除路径)。 一旦我列出了数百万行:

firebase database:remove /root/messages/messageid_1/field --confirm &&
firebase database:remove /root/messages/messageid_2/field --confirm &&
...

即使考虑每行几毫秒的执行时间,整个执行过程也可能需要 (天)的时间。

问题 #2 - 在本地删除并重新上传数据库:建议的另一个解决方案是下载整个数据库,删除 json 路径并重新上传上传它。 目前,整个数据库重达60GB。 是否可以从 Firebase 控制台重新加载整个数据库? (考虑到我必须同时暂停任何写入,以避免数据丢失)

还有其他可能的解决方案吗?

常见的路径是:

  1. 为您的数据库启用自动备份,并从存储桶下载 JSON。
  2. 在本地处理JSON,并确定要删除的所有节点的确切路径。
  3. 使用 multi-location 更新通过 API 以合理大小的块处理路径。

删除每个节点块类似于:

var nodesToRemove = ["/root/messages/messageid_1/field", "/root/messages/messageid_2/field"];

var updates = nodesToRemove.map(function(path) { 
  return { [path]: null };
});
firebase.database().ref().update(updates);