使用Cloud Functions删除实时数据库中所有出现的UID

时间:2019-12-02 20:22:16

标签: firebase firebase-realtime-database google-cloud-functions

我想向我的Firebase应用程序添加一个云功能,该功能在删除用户时进行监听。每当删除用户时,在我的数据库中出现的删除用户的UID都应删除。

我的应用程序与tinder类似,因为您可以与其他用户“匹配”。因此,我数据库中的每个用户对象都具有“ matches”属性,该属性是与其匹配的其他用户的字典。 “ matches”字典中的键是匹配的用户的UID,而值是用户匹配的UNIX时间戳。看起来像这样:

Users
    |
    |___ abcdefg12345
    |        |___ name: "User 1"
    |        |___ matches
    |                |___ zyxwvut98765: 1575135895.6376572
    |                |___ c6h7d8m9a0y7: 1575135903.1829304
    |
    |___ zyxwvut98765
    |        |___ name: "User 2"
    |        |___ matches
    |                |___ abcdefg12345: 1575135895.6376572
    |
    |___ c6h7d8m9a0y7
    |        |___ name: "User 3"
    |        |___ matches
    |                |___ abcdefg12345: 1575135903.1829304
    |

因此,在上面的示例中,每当删除Users/abcdefg12345时,我都需要云功能来删除Users/zyxwvut98765/matches/abcdefg12345Users/c6h7d8m9a0y7/matches/abcdefg12345

我知道如何使用云功能通过以下方式更新单个用户对象:

let uid = "c6h7d8m9a0y7";
let dic = ["name":"User 3", "matches":[]];
admin.database().ref('Users').child(uid).update(dic);

我能够侦听用户的删除,并获取通过以下方式删除的用户的UID:

exports.deleteListener = functions.database.ref('/Users/{User}').onDelete((snapshot, context) =>
{
    let uid = context.params.User;
    console.log(uid);
});

我只是不确定在抓住这个已删除的UID之后如何删除可能无限数量的单个节点。

1 个答案:

答案 0 :(得分:2)

只要您有合理的孩子名单,就可以用一个update()语句完成所有这些工作。

exports.deleteUser = functions.database.ref('/Users/{User}').onDelete((snapshot, context) => {
  let uid = context.params.User;
  let matches = snapshot.val().matches;
  let updates = {};
  Object.keys(matches).forEach((key) => {
    updates[`/Users/${key}/matches/${uid}`] = null;
  });
  return admin.database().ref().update(updates);
});