当数据以扇出方式位于多个路径时,如何在Firebase数据库中进行一致删除?
Firebase建议将数据扇出到不同的节点和路径,如Firebase示例中的以下示例:当数据以扇出方式位于多个路径时,如何在Firebase数据库中进行一致删除?,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,Firebase建议将数据扇出到不同的节点和路径,如Firebase示例中的以下示例: { "post-comments" : { "PostId1" : { "CommentID1" : { "author" : "User1", "text" : "Comment1!", "uid" : "UserId1" } } }, "posts" : { "PostId1" : {
{
"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
}
}
在这两种情况下,从多路径中原子地或一致地删除数据(要么全部删除,要么什么也不删除)的问题似乎都不可用
在这种情况下,唯一可用的选项似乎是将delete命令放在Firebase队列中,这将仅在删除所有内容时解析队列中的任务。这将是最终一致的选择,但应该是好的。但这是一个需要服务器的昂贵选项。有更好的方法吗?您可以通过向路径写入null值来实现多路径删除 因此: 我以前已经回答过这个问题: 在以下章节中也有明确提到: 还可以通过指定null作为另一个写入操作(如set或update)的值来删除。您可以将此技术与update结合使用,在一个API调用中删除多个子项
通过向路径写入null值,可以实现多路径删除 因此: 我以前已经回答过这个问题: 在以下章节中也有明确提到: 还可以通过指定null作为另一个写入操作(如set或update)的值来删除。您可以将此技术与update结合使用,在一个API调用中删除多个子项
请在每篇文章中坚持一个问题。请在每篇文章中坚持一个问题。谢谢。我使用多路径搜索,使用多位置作为搜索词或批量搜索,我会得到它。虽然文档提到我认为它会使数据无效,并且不会删除发布的密钥。我添加了文档中的链接和引用。我相信在更新数组的最后一行@FrankvanPuffelen.Good catch Jordi中您缺少了一个:!修好了,谢谢。我使用多路径搜索,使用多位置作为搜索词或批量搜索,我会得到它。虽然文档提到我认为它会使数据无效,并且不会删除发布的密钥。我添加了文档中的链接和引用。我相信在更新数组的最后一行@FrankvanPuffelen.Good catch Jordi中您缺少了一个:!固定的
var updates = {
"user-posts/UserId1/PostId1": null,
"post-comments/PostId1": null,
"posts/PostId1": null
}
ref.update(updates);