【问题标题】:Remove all e-mail properties from users document in Firebase从 Firebase 中的用户文档中删除所有电子邮件属性
【发布时间】:2020-12-12 13:02:14
【问题描述】:

(出于隐私目的删除数据)
我有成千上万的用户将他们的电子邮件存储在 firebase 数据库中,我想删除其中的所有 email 属性。不一一做最安全的方法是什么?

【问题讨论】:

  • 您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 的溢出菜单 (⠇) 中的 Export JSON 链接轻松获得。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。

标签: javascript node.js firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

您只能通过写入整个路径来从数据库中删除一个值。因此,根据定义,您必须对每个用户节点执行写入操作。

但对于几千个用户来说,这实际上并不算什么大问题。在 JavaScript 中:

let ref = firebase.database().ref("/users");
let query = ref.orderByChild("email").startAt(null);
return query.once("value").then((results) => {
  let updates = {};
  results.forEach((snapshot) => {
    updates[snapshot.key+"/email"] = null;
  });
  return ref.update(updates);
})

以上代码:

  • 查找所有拥有电子邮件地址的用户。
  • 构建一个对象来清除每个用户的电子邮件地址。
  • 为所有用户向数据库发送单个写入操作。

您可以在 JavaScript 客户端、使用 Admin SDK 作为 Node 脚本或在 Cloud Functions 中运行此代码(在这种情况下,它也将使用 Admin SDK)。


如果你要更新的节点太多,你也可以尝试分批更新,或者像这段代码一样逐个更新:

let ref = firebase.database().ref("/users");
let query = ref.orderByChild("email").startAt(null);
return query.once("value").then((results) => {
  let promises = []
  results.forEach((snapshot) => {
    promises.push(snapshot.ref.child("email").remove());
  });
  return Promise.all(promises);
})

【讨论】:

  • 我刚试过这个,顺便说一句,它工作得非常顺利。非常感谢。
  • ...它在我创建的一个小测试文档上运行得非常顺利。现在我收到TOO_MANY_TRIGGERS 错误,可能是因为......触发器太多。现在正在努力寻找解决方案。
  • 我想知道,当 results 是一个对象时,你如何处理结果?我在节点操场上试过这个,但它没有用,但是你上面的代码没有抛出任何错误,forEach on results can't be applied,当我记录结果时,它是一个我为它构建一个类似的对象测试,测试失败。我很困惑。
  • results is a DataSnapshot`,这是 Firebase SDK 中的一个类。如果您很难让它发挥作用,请编辑您的问题以显示您尝试过的内容。
  • 不,这很好用(你的答案的第二部分,Promise.all() 之一),我只是想知道为什么手动尝试 forEach 对一个对象不起作用,但它确实适用于 results对象。
【解决方案2】:

一种解决方案是利用 RTDB 控制台的导入导出功能:

将数据导出为JSON,用你选择的方法修改JSON数据,删除数据库中的所有数据,导入修改后的JSON。

【讨论】:

  • 如果有人在它的过程中注册怎么办?我想到了这一点,但我认为这不是最佳解决方案,因为它替换了所有现有数据
  • "如果有人在这个过程中注册怎么办?" => 显然,这是一个维护动作,你应该在处理时关闭访问(前端的安全规则和错误消息?)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 2013-08-22
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多