2017-02-10 70 views
0

随着火力地堡扇出数据到不同的节点和路径由火力地堡像例如由火力地堡样品低于推荐:如何在Firebase数据库中以扇出方式存在多个路径时进行一致性删除?

{ 
    "post-comments" : { 
    "PostId1" : { 
     "CommentID1" : { 
     "author" : "User1", 
     "text" : "Comment1!", 
     "uid" : "UserId1" 
     } 
    } 
    }, 
    "posts" : { 
    "PostId1" : { 
     "author" : "user1", 
     "body" : "Firebase Mobile platform", 
     "starCount" : 1, 
     "stars" : { 
     "UserId1" : true 
     }, 
     "title" : "About firebase", 
     "uid" : "UserId1" 
    } 

    }, 
    "user-posts" : { 
    "UserId1" : { 
     "PostId1" : { 
     "author" : "user1", 
     "body" : "Firebase Mobile platform", 
     "starCount" : 1, 
     "stars" : { 
      "UserId1" : true 
     }, 
     "title" : "About firebase", 
     "uid" : "UserId1" 
     } 

    } 
    }, 
    "users" : { 
    "UserId1" : { 
     "email" : "[email protected]", 
     "username" : "user1" 
    } 
    } 
} 
  1. 随着多路径的更新,我们可以以原子方式更新信息中的所有的路径,但是,如果我们想要在上述类型的模式中删除博客文章,那么我们如何以原子方式执行它?我想,没有多路径删除。如果客户端在删除时会丢失网络连接,则只会删除几条路径!

  2. 此外,如果有一个要求当用户被删除的所有他已经加星标的帖子,我们应该删除星星和unstar该用户的帖子。这变得困难,因为没有直接跟踪用户已经出演的帖子。为此,我们需要将帖子的主角扇出,就像有一个节点用户明星一样。然后,在删除时,我们知道用户在删除用户时所做的所有活动并对其执行操作。有没有更好的方法来处理这个问题?

    "user-stars":{ 
        "UserId1":{ 
         "PostID1":true 
        } 
    } 
    

在这两种情况下的原子或持续从多径删除数据的问题(无论是全有或全无)似乎是不可用的。

在这种情况下,唯一可用的选项似乎是将删除命令放入Firebase队列中,只有删除了所有内容时,才能解析队列中的任务。这将是最终一致的选择,但应该没问题。但这是昂贵的选项,需要服务器。有没有更好的办法?

+0

请每个帖子坚持一个问题。 –

回答

4

通过向路径写入值null,可以实现多路径删除。

所以:

var updates = { 
    "user-posts/UserId1/PostId1": null, 
    "post-comments/PostId1": null, 
    "posts/PostId1": null 
} 
ref.update(updates); 

我已经回答了这个前:Firebase -- Bulk delete child nodes

它也很明确the documentation on deleting data提到:

您也可以通过指定NULL作为值删除另一个写操作,如set()或update()。您可以使用update()方法在单个API调用中删除多个子项。

+0

谢谢。我搜索使用多路径,使用多位置搜索字或批量我会得到它。虽然文件提到我认为它会使数据为空而不删除密钥(PostId)。 –

+0

我在文档中添加了一个链接和引用。 –

+0

我相信你在更新数组@FrankvanPuffelen的最后一行缺少一个“:”。 –

相关问题