使用Firebase将数据扇出到不同的节点和Firebase推荐的路径,如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" : "user1@gmail.com",
"username" : "user1"
}
}
}
通过多路径更新,我们可以原子地更新帖子的所有路径,但是如果我们想要删除上述类型的模式中的博客文章,那么我们如何以原子方式进行呢?我猜,没有多路径删除。如果客户端在删除时丢失了网络连接,则只删除少量路径!
如果有一个要求赞,当用户被删除所有已加星标的帖子时,我们应该删除星标并取消该用户的帖子。这变得困难,因为没有直接跟踪用户已加星标的帖子。为此,我们需要散布帖子的主演,以及拥有节点用户明星。然后在删除时我们知道用户所做的所有活动,并在删除用户时对其进行操作。有没有更好的方法来处理这个?
"user-stars":{
"UserId1":{
"PostID1":true
}
}
在这两种情况下,原子地或一致地从多路径中删除数据的问题(全部或全部)似乎都不可用。
在这种情况下,唯一可用的选项是将删除命令放在Firebase队列中,只有在删除所有内容时才会解析队列中的任务。这将是最终一致的选择,但应该没问题。但这是需要服务器的昂贵选择。还有更好的方法吗?
答案 0 :(得分:5)
您可以通过将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调用中删除多个子项。