db结构:
--followers
-followedUser1
-user1
-followedUser2
-user1
-user2
--users
-user1
-followed
-followedUser1
-followedUser2
-user2(followedUser1)
-followed
-followedUser2
-user3(followedUser2)
每次用户都关注(ongreate)&在关注者/{Chanduser}/{followerUser}路径下取消关注(OnDelete),IT触发功能,该功能会增加或取消计数,并分配或分配或从关注者中分配或脱离帖子。它是通过粉丝方法来工作的,没有问题。现在,更糟糕的是,当某些用户完全删除帐户与他自己的追随者分离时(因为他的帐户将是一个幽灵),我将触发器设置为trigger onDelete,以指示何时发生,然后通过此用户迭代(i.user3))关注者将自己从相应的关注者中脱离了他的帐户,看起来这样:
--followers
-followedUser1
-user1
-followedUser2
-user1
-user2
--users
-user1
-followed
-followedUser1
-user2(followedUser1)
现在,有问题的部分 - 当承诺返回时,我也想删除整个追随者/constuser2(因为现在是一个幽灵)路径,但是...不幸的是,有一个触发器为每个关注者执行(OnDelete)。因此,是否有机会在不触发儿童本身的情况下删除上方的路径(升级)删除触发器?或任何其他方法都很棒,谢谢
编辑:不要误会我的意思,它将起作用,但是如果关注者下的关注者数量将是"很多"服务器,则在100次之后死亡...触发
目前,无法过滤哪些删除事件会触发该功能,因此您是正确的,每个用户删除用户都关注的每个用户将触发一次函数。我知道这是许多用例中有用的用例之一,因此,如果有机会,请在此处填写功能请求。
看来,您的多个更新问题可以通过多点更新解决
在非常快速的黑客攻击中,未测试的打字稿:
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);
}
请注意,这仍然会触发您的计数功能,但这应该可以并行运行。它可能使您的应用程序分别捕获每个不变。