Db结构:
--followers
-followedUser1
-user1
-followedUser2
-user1
-user2
--users
-user1
-followed
-followedUser1
-followedUser2
-user2(followedUser1)
-followed
-followedUser2
-user3(followedUser2)
每次用户关注(onCreate)&在followers / {followUser} / {followerUser}路径下取消关注(onDelete),它触发增加或减少计数的功能,并从追随者分配或分离帖子。它通过扇出方法工作,没有问题。现在,更糟糕的部分来自一些用户完全删除帐户并将他的粉丝从他自己中删除(因为他的帐户将是一个幽灵),我设置触发器删除指示何时发生,然后迭代通过该用户(ieuser3)追随者从相应的粉丝和他的账户中删除自己,看起来就像这样:
--followers
-followedUser1
-user1
-followedUser2
-user1
-user2
--users
-user1
-followed
-followedUser1
-user2(followedUser1)
现在,有问题的部分 - 当承诺返回时我还想删除整个跟随者/ followUser2(因为它现在是一个鬼)路径但是...有一个触发器,不幸地为(onDelete)下的每个追随者执行。那么,有没有机会删除上面的路径(levelup)删除触发器而不触发孩子本身?或者任何其他方法都会很棒,谢谢
编辑:不要误会我的意思,它会起作用但是如果追随者的数量跟随用户将是“很多”服务器将在100之后死亡...触发器
答案 0 :(得分:3)
此时,无法过滤哪些删除事件将触发该功能,因此您是正确的,该功能将被删除的用户所关注的每个用户触发一次。我知道这是许多使用此类功能的用例之一,因此如果您有机会,请填写功能请求here。
答案 1 :(得分:1)
您的多重更新问题似乎可以通过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);
}
请注意,这仍将触发您的计数功能,但并行运行应该没问题。它可能会使您的应用程序更简单,可以单独捕获每个不变量。