删除用户帐户触发另一节点

问题描述:

Db的结构的缺失:删除用户帐户触发另一节点

--followers 
    -followedUser1 
    -user1 
    -followedUser2 
    -user1 
    -user2 
--users 
    -user1 
    -followed 
    -followedUser1 
    -followedUser2 
    -user2(followedUser1) 
    -followed 
    -followedUser2 
    -user3(followedUser2) 

每次用户如下(的onCreate)& unfollows(onDelete)下的追随者/ {followedUser}/{followerUser}路径,它触发功能,其增加或并且从追随者分配或分离职位。它通过扇出方法工作,并没有问题。现在,更糟糕的部分是当一些用户完全删除账户并将他的追随者从他自己中删除(因为他的账户将是一个幽灵),我已经设置触发器onDelete来指示它什么时候会发生,然后遍历该用户的(ieuser3 )的追随者删除自己从相应的追随者以及他的帐户,它看起来像这样,那么:

--followers 
    -followedUser1 
    -user1 
    -followedUser2 
    -user1 
    -user2 
--users 
    -user1 
    -followed 
    -followedUser1 
    -user2(followedUser1) 

现在,问题的一部分 - 当承诺的回报,我想也删除整个跟随/ followedUser2(因为它是一个鬼了)路径,但...有一个触发器,不幸的是为(onDelete)下的每个追随者执行。那么,是否有机会删除上面的路径(levelup)删除触发器而不触发子节点本身?或任何其他的办法将是巨大的,感谢

编辑:不要误会我的意思,它会工作,但如果followedUser下追随者的数量将是“很多”服务器将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); 
} 

注意,这仍然会解雇你的计数功能,但这应该可以并行运行。这可能会让您的应用程序更简单,让每个不变量单独捕获。

+0

此外,作为参考,'_'是lodash模块的常用变量名称。这是一个非常棒的工具,可以帮助您编写功能代码来执行列表推导。这种编码方式可以让您编写更多精简的代码,无需担心逐个错误或边界情况下的零个,一个和多个列表。 –

+0

谢谢,但这是我已经得到的。我想我可能不清楚我的问题。我的情况是,用户有100000个追随者,他想要删除他的账户,现在我的计数和附加/分离邮件功能将激活10万次,所以如果我将所有与该触发器相关的东西都收集起来,并把它放在多位置更新像你必须使前一个触发器停用,但这是我的问题:如何过滤,我正在删除用户帐户与他的追随者+数他们等,并防止(以某种方式)取消关注(onDelete)触发器火 –

+0

我明白了。这是一个不同于我以为的问题。在100K粉丝中,你会遇到另一个问题。数据库在每次写入1K事件时具有硬限制;如果超过这个数字,则不会触发事件。您可以批量写入或滥用此操作以更新计数(但要小心跨100K节点的事务几乎肯定会失败)。老实说,100K更新似乎有点奇怪的边缘情况下,你花时间优化(只要它工作)。你真的期望用户能够获得如此的知名度并经常离开吗? –