删除用户帐户会触发删除其他节点
Deleting user account triggers deletion of another nodes
数据库结构:
--followers
-followedUser1
-user1
-followedUser2
-user1
-user2
--users
-user1
-followed
-followedUser1
-followedUser2
-user2(followedUser1)
-followed
-followedUser2
-user3(followedUser2)
每次用户在 followers/{followedUser}/{followerUser} 路径下关注(onCreate)和取消关注(onDelete)时,它都会触发增加或减少计数以及从关注者分配或分离帖子的功能。它通过扇出方法工作,没有问题。现在,更糟糕的是,当某些用户完全删除帐户并将他的关注者与他自己分离时(因为他的帐户将是一个幽灵),我设置了触发器 onDelete 以指示它何时会发生,然后遍历该用户的(即 user3 ) followers 将自己从相应的followers 加上他的账号中移除,然后是这样的:
--followers
-followedUser1
-user1
-followedUser2
-user1
-user2
--users
-user1
-followed
-followedUser1
-user2(followedUser1)
现在,有问题的部分 - 当承诺 returns 我也想删除整个 follower/followedUser2(因为它现在是一个幽灵)路径但是......不幸的是有一个触发器执行(onDelete) 下的每个关注者。那么,是否有机会在不触发子项本身的情况下删除 path above(levelup) 删除触发器?或者任何其他方法都很好,谢谢
编辑:不要误会我的意思,它会起作用,但如果 followedUser 下的关注者数量为 "a lot" 服务器将在 100 后死亡...触发
目前无法过滤哪些删除事件会触发该功能,所以你是对的,该功能将为被删除用户关注的每个用户触发一次。我认识到这是此类功能有用的众多用例之一,因此如果您有机会,请填写功能请求 here.
看来您的多次更新问题可以通过 multi-location updates
解决
很快就拼凑在一起并且没有测试打字稿:
export const cleanupFollowers = functions.auth.user().onDelete(event => {
const user = event.data.userId;
const followersNode = admin.database().ref(`followers/${user}`);
const followers = _.keys(await followersNode.once('value'));
// Every follower also has a reverse node for this user. Get the list of keys:
const reverseNodesToDelete = followers.map(follower => `followers/${follower}/${user}`);
// Model this update as a map of deep key -> null to delete all at once
let cleanup = _.keyBy(reverseNodesToDelete, null);
// add one more update: deleting full node for the deleted user.
cleanup[`followers/${user}`] = null;
// do all deletions as one database request:
return admin.database().ref().update(cleanup);
}
请注意,这仍会触发您的计数功能,但并行 运行 应该没问题。单独捕获每个不变量可能会使您的应用程序更简单。
数据库结构:
--followers
-followedUser1
-user1
-followedUser2
-user1
-user2
--users
-user1
-followed
-followedUser1
-followedUser2
-user2(followedUser1)
-followed
-followedUser2
-user3(followedUser2)
每次用户在 followers/{followedUser}/{followerUser} 路径下关注(onCreate)和取消关注(onDelete)时,它都会触发增加或减少计数以及从关注者分配或分离帖子的功能。它通过扇出方法工作,没有问题。现在,更糟糕的是,当某些用户完全删除帐户并将他的关注者与他自己分离时(因为他的帐户将是一个幽灵),我设置了触发器 onDelete 以指示它何时会发生,然后遍历该用户的(即 user3 ) followers 将自己从相应的followers 加上他的账号中移除,然后是这样的:
--followers
-followedUser1
-user1
-followedUser2
-user1
-user2
--users
-user1
-followed
-followedUser1
-user2(followedUser1)
现在,有问题的部分 - 当承诺 returns 我也想删除整个 follower/followedUser2(因为它现在是一个幽灵)路径但是......不幸的是有一个触发器执行(onDelete) 下的每个关注者。那么,是否有机会在不触发子项本身的情况下删除 path above(levelup) 删除触发器?或者任何其他方法都很好,谢谢
编辑:不要误会我的意思,它会起作用,但如果 followedUser 下的关注者数量为 "a lot" 服务器将在 100 后死亡...触发
目前无法过滤哪些删除事件会触发该功能,所以你是对的,该功能将为被删除用户关注的每个用户触发一次。我认识到这是此类功能有用的众多用例之一,因此如果您有机会,请填写功能请求 here.
看来您的多次更新问题可以通过 multi-location updates
解决很快就拼凑在一起并且没有测试打字稿:
export const cleanupFollowers = functions.auth.user().onDelete(event => {
const user = event.data.userId;
const followersNode = admin.database().ref(`followers/${user}`);
const followers = _.keys(await followersNode.once('value'));
// Every follower also has a reverse node for this user. Get the list of keys:
const reverseNodesToDelete = followers.map(follower => `followers/${follower}/${user}`);
// Model this update as a map of deep key -> null to delete all at once
let cleanup = _.keyBy(reverseNodesToDelete, null);
// add one more update: deleting full node for the deleted user.
cleanup[`followers/${user}`] = null;
// do all deletions as one database request:
return admin.database().ref().update(cleanup);
}
请注意,这仍会触发您的计数功能,但并行 运行 应该没问题。单独捕获每个不变量可能会使您的应用程序更简单。