当数据以扇出方式位于多个路径时,如何在Firebase数据库中进行一致删除?

当数据以扇出方式位于多个路径时,如何在Firebase数据库中进行一致删除?,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,Firebase建议将数据扇出到不同的节点和路径,如Firebase示例中的以下示例: { "post-comments" : { "PostId1" : { "CommentID1" : { "author" : "User1", "text" : "Comment1!", "uid" : "UserId1" } } }, "posts" : { "PostId1" : {

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  
    }
}
在这两种情况下,从多路径中原子地或一致地删除数据(要么全部删除,要么什么也不删除)的问题似乎都不可用


在这种情况下,唯一可用的选项似乎是将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);