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

Firebase 删除用户帐户会触发删除其他节点,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,数据库结构: --followers -followedUser1 -user1 -followedUser2 -user1 -user2 --users -user1 -followed -followedUser1 -followedUser2 -user2(followedUser1) -followed -followedUser2 -user3(followedUser2) 每当用户在followers/{fo

数据库结构:

--followers
  -followedUser1
   -user1
  -followedUser2
   -user1
   -user2
--users
  -user1
   -followed
    -followedUser1
    -followedUser2
  -user2(followedUser1)
   -followed
    -followedUser2
  -user3(followedUser2)
每当用户在followers/{followedUser}/{followerUser}路径下执行(onCreate)&unfollows(onDelete)操作时,它都会触发一个函数,该函数增加或取消跟踪计数,并从跟随者分配或分离帖子。它通过扇出法工作,没有问题。现在,更糟糕的是,当一些用户完全删除帐户并将其追随者与自己分离(因为他的帐户将是一个幽灵)时,我设置了触发器onDelete以指示何时会发生,然后遍历该用户(即user3)的追随者将其从相应的追随者和他的帐户中移除,看起来是这样的:

--followers
  -followedUser1
   -user1
  -followedUser2
   -user1
   -user2
--users
  -user1
   -followed
    -followedUser1
  -user2(followedUser1)
现在,有问题的部分-当承诺返回时,我还想删除整个follower/followerduser2(因为它现在是一个幽灵)路径,但是。。。有一个触发器不幸地对(onDelete)下的每个跟随者执行。那么,是否有可能在不触发子级本身的情况下删除路径高于(levelup)的删除触发器?或者任何其他方法都很好,谢谢


编辑:别误会我的意思,这是可行的,但如果followedUser下的追随者数量“很多”,服务器将在100后死亡。。。触发

此时,无法筛选哪些删除事件将触发该功能,因此您是正确的,该功能将为被删除用户跟踪的每个用户触发一次。我认识到这是此类功能非常有用的许多用例之一,因此如果您有机会,请填写功能请求。

此时,无法筛选哪些删除事件将触发该功能,因此您是正确的,该功能将针对被删除用户跟踪的每个用户触发一次。我认识到这是此类功能非常有用的许多用例之一,因此如果您有机会,请填写功能请求。

看起来您的多个更新问题可以通过

在非常快速地拼凑在一起且未经测试的typescript中:

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

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

看起来您的多个更新问题可以通过

在非常快速地拼凑在一起且未经测试的typescript中:

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

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

此外,作为参考,“\u0”是lodash模块常用的变量名。这是一个非常好的工具,可以帮助您编写函数代码来理解列表。这种风格的编码可以让你编写更简洁的代码,而不必担心一个接一个的错误,或是零、一、多列表的边缘情况。我想我可能没有把我的问题弄清楚。我的情况是,用户有100000个追随者,他想删除他的帐户,现在我的计数和附加/分离帖子功能将启动100000次,所以如果我将所有与该触发器相关的内容都放在多位置更新中,就像你必须使前一个触发器停用一样,不是更好吗,但这就是我的问题:如何过滤我正在删除的用户帐户和他的追随者+计数他们等,并防止(不知何故)unfollows(onDelete)触发fireisee。这是一个不同于我想象的问题。实际上,你会在10万粉丝中遇到另一个问题。数据库的硬限制为每次写入1K个事件;如果超过此值,则不会触发任何事件。您可以批处理写入操作,也可以滥用此操作来更新计数(但请注意,跨100K节点的事务几乎肯定会失败)。老实说,对于你来说,花时间优化100K更新似乎有点奇怪(只要它有效)。你真的期望用户获得如此高的人气并经常离开吗?作为一个额外的警告,即使是Facebook也只允许用户或页面跟踪5000人(Facebook.com/help/community/question/?id=567604083305019)。如果你期望高连接,你可能需要考虑像非对称关系之类的优化。不,我不认为我需要一次多的连接,但是在我当前的设置中,有一些用户有任何数量的追随者会触发计数X,不跟随数字。所以,是的,我正在尝试实现某种twitter克隆,当你可以看到用户的追随者和跟踪者时,我在这里碰壁了。为了提供他有多少追随者/追随者,我需要通过db记录进行统计。我想在客户机上设置它,比如动态计算追随者,但这不起作用,因为我正在批量获取基本上所有的数据。另外,作为参考,“_”是lodash模块常用的变量名。这是一个非常好的工具,可以帮助您编写函数代码来理解列表。这种风格的编码可以让你编写更简洁的代码,而不必担心一个接一个的错误,或是零、一、多列表的边缘情况。我想我可能没有把我的问题弄清楚。我的情况是,用户有100000个追随者,他想删除他的帐户,现在我的计数和附加/分离帖子功能将启动100000次,所以如果我将所有与该触发器相关的内容都放在多位置更新中,就像你必须使前一个触发器停用一样,不是更好吗,但这就是我的问题:如何过滤我正在删除的用户帐户和他的追随者+计数他们等,并防止(不知何故)unfollows(onDelete)触发fireisee。这是一个不同于我想象的问题。实际上,你会在10万粉丝中遇到另一个问题。数据库的硬限制为每次写入1K个事件;如果超过此值,则不会触发任何事件。你能猜出来吗