我想向我的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/abcdefg12345
和Users/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之后如何删除可能无限数量的单个节点。
答案 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);
});