删除用户帐户会触发删除其他节点

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);
 }

请注意,这仍会触发您的计数功能,但并行 运行 应该没问题。单独捕获每个不变量可能会使您的应用程序更简单。