删除 Firebase 实时数据库中的数百万个字段
Delete millions of fields in Firebase Realtime Database
我必须删除不同位置的多个字段。
我有 数百万 条包含多个字段的“消息”,例如:
messagesId: {
text: "...",
datetime: "...",
unusedField: "...", <-- REMOVE
...
}, ...
为了节省存储空间 space,我想为每条消息删除旧的和未使用的字段。这意味着,节省数十 Giga,别名钱(我们目前支付的数百美元,因为除了 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 控制台重新加载整个数据库? (考虑到我必须同时暂停任何写入,以避免数据丢失)
还有其他可能的解决方案吗?
常见的路径是:
- 为您的数据库启用自动备份,并从存储桶下载 JSON。
- 在本地处理JSON,并确定要删除的所有节点的确切路径。
- 使用 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);
我必须删除不同位置的多个字段。 我有 数百万 条包含多个字段的“消息”,例如:
messagesId: {
text: "...",
datetime: "...",
unusedField: "...", <-- REMOVE
...
}, ...
为了节省存储空间 space,我想为每条消息删除旧的和未使用的字段。这意味着,节省数十 Giga,别名钱(我们目前支付的数百美元,因为除了 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 控制台重新加载整个数据库? (考虑到我必须同时暂停任何写入,以避免数据丢失)
还有其他可能的解决方案吗?
常见的路径是:
- 为您的数据库启用自动备份,并从存储桶下载 JSON。
- 在本地处理JSON,并确定要删除的所有节点的确切路径。
- 使用 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);