使用子值删除父节点

时间:2018-06-17 23:52:51

标签: swift firebase firebase-realtime-database

我正在努力克服我的问题。我正在尝试删除父节点/密钥,因为我找到了正确的子值。

My database is structure liked this

我通过某个值objectID查询我的数据库,因为它将匹配通过参数传递的postIDobjectID值已删除。但是,我正在努力删除它所属的密钥。

到目前为止我的结果好坏参半:

我可以使用以下代码删除objectID值:

refSnap?.ref.child("objectID").child(postID).removeValue()

我可以删除整个notifications节点/目录,使用:

refSnap?.ref.child("objectID").queryEqual(toValue: postID).ref.removeValue()

refSnap?.key为我提供了notifications节点下的所有密钥/节点。

我无法访问objectID和所有其他信息存储的密钥,因为它是.childByAutoId。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您的问题是您正在使用childByAutoId并且您无法将这些随机字母数字“绑定”到某些内容(在本例中为帖子)。

我要设置的结构是:

-notifications

  --uid //notifications for user
      --- userAid+userBid //follow notification, if they unfollow you already now which one it is and you can go and delete it
      ---commentNotificationID // you give this notification the same Id that the comment has, so if the user deletes the comment you use that id to delete the notification as well.

答案 1 :(得分:0)

虽然其他答案通过一种可替代的可行结构提供了一些见识,但是基于子级删除节点的功能非常简单,可以直接解决该问题,而无需更改结构。

(请注意,无论如何都可能需要更改结构,但在本练习中,我们将按原样使用它。)

给出问题中建议的结构:

notification
   "rtupy..." //childByAutoId
      "-LFEMjAcny..." // childByAutoId
      "-LFEzrrq..."  // childByAutoId
          from: "aw,sdasdad"
          objectID: "-LFEMjAcn...."
          timestamp: 15292
          type: "comment"

假设您要删除节点“ -LFEzrrq ...”,如屏幕截图所示。该节点包含子对象ID:“-LFEMjAcn ....”

要删除该节点,您需要查询包含所需对象ID的节点,根据该问题,该对象ID正在工作并返回正确的子对象。

使用返回的快照获取其父密钥,并获取该节点的路径并将其删除。请注意,我们不知道OP用来获取要删除的节点的过程或代码是什么-可能是从另一个查询中传入的,而节点引用是通过其他方式传递的。

let queryRef = //unknown how, but build the query for objectID = "-LFEMjAcny...."
queryRef.observeSingleEvent(of: .value, with: { snapshot in
    let key = snapshot.key //this is the parent key of the objectID node i.e. -LFEMzrrq..."
    let parentRef = snapshot.ref.parent! //this is the path to that parent
    let refToDelete = parentRef.child(key) //add the parent key to the path: -LFEzrrq
    refToDelete.removeValue() //delete it
})

如您所见,无论父节点的键有多深,此代码都将删除在查询中找到的节点。

密钥名称无关紧要,因此使用.childByAutoId作为将节点绑定在一起的引用是安全的,并且通常是最佳实践,因为将节点密钥与它们所包含的数据解除关联可以使您的结构高度扩展。