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

Abh*_*t_K 0 firebase firebase-realtime-database

使用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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 通过多路径更新,我们可以原子地更新帖子的所有路径,但是如果我们想要删除上述类型的模式中的博客帖子,那么我们如何以原子方式进行操作呢?我猜,没有多路径删除.如果客户端在删除时丢失网络连接,则只删除少量路径!

  2. 此外,如果有一个要求,例如当用户被删除所有已经加星标的帖子时,我们应该删除星标并取消该用户的帖子.这变得困难,因为没有直接跟踪用户已加星标的帖子.为此,我们需要散布帖子的主演,以及拥有节点用户明星.然后在删除时我们知道用户所做的所有活动,并在删除用户时对其进行操作.有没有更好的方法来处理这个?

    "user-stars":{
        "UserId1":{
            "PostID1":true  
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

在这两种情况下,原子地或一致地从多路径中删除数据的问题(全部或全部)似乎都不可用.

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

Fra*_*len 5

您可以通过将值写入路径来实现多路径删除null.

所以:

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

我之前已经回答过这个问题:Firebase - 批量删除子节点

在删除数据的文档中也明确提到了这一点:

您还可以通过将null指定为另一个写操作(如set()或update())的值来删除.您可以将此技术与update()一起使用,以在单个API调用中删除多个子项.