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

时间:2020-09-11 10:02:23

标签: firebase firebase-realtime-database firebase-cli

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

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

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

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

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

即使考虑每行的执行时间为几毫秒,整个执行时间也可能花费不可接受的长时间(天)。

问题2-在本地删除并重新上传数据库:建议的另一种解决方案是下载整个数据库,删除json路径并重新上传。 目前,整个数据库的重量为60GB。 是否可以从Firebase控制台重新加载整个数据库? (鉴于我必须同时暂停所有写操作以避免数据丢失的事实)

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

1 个答案:

答案 0 :(得分:1)

常见的路径是:

  1. 为数据库启用自动备份,然后从“存储”存储桶下载JSON。
  2. 在本地处理JSON,并确定要删除的所有节点的确切路径。
  3. 使用多位置更新,通过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);