如何在不下载和上传数据的情况下复制具有许多记录的 Firebase 子项

How to duplicate a Firebase child with many records without downloading and uploading the data?

本文关键字:复制 许多 记录 子项 Firebase 情况下 下载和 数据      更新时间:2023-09-26

我有一个Firebase孩子,有近50万条记录。我想复制这个孩子,以便创建数据的备份(在同一 Firebase 中)。所以,如果我的孩子叫lines,我想复制它,但用一个新名字,如 lines_backup_02_02_2016 .完成此操作后,我希望原始lines保持原样。

有没有办法做到这一点,而无需通过Javascript抓取dataSnapshot(下载数据),然后使用set()创建副本?例如:

fb.child("lines").once('value', function(snapshot) {
    fb.child("lines_backup_02_02_2016").set(snapshot.val());
  });

对于 500k 条记录,我发现这比我到目前为止能够等待的时间更长(例如,我在等待它完成的同时输入了这个问题)。

尝试访问/查询具有 500k 子记录的节点是一个坏主意。您也不太可能需要将这些 500k 行同步到用户。因此,请努力将活动数据与历史数据分开。您当前创建备份副本的方法是一个很好的开始。只需在将节点写入新位置时删除节点即可。

获取这些数据将"有点涉及"。它确实涉及首先使用浅层 REST 调用获取子键的列表:

https://yours.firebaseio.com/path-to-list.json?shallow=true

然后,您循环访问密钥并使用常规 JavaScript 客户端依次访问每个子项:

ref.child('path-to-list').child(key).once('value', function(snapshot) {
  ref.child('path-to-backup').child(key).set(snapshot.val(), function(error) {
    if (!error) {
      // Delete the original item, so that the list stays small
      snapshot.ref().remove();
    }
  });
});

此循环不会产生问题,因为您不会查询整个列表。相反,您直接访问特定的子节点,这很好。

请务必限制循环,否则可能会用少量写入淹没数据库。