0

有以下问题:

我在我的实时 Firebase 数据库中对我的数据结构进行了非规范化。因此,我需要更新所有其他“帖子”(在本例中为食谱)以及不同作者的食谱中的用户名。为此,每次用户对食谱创建评论时,该用户还会在其用户对象中创建对该食谱的引用。

现在,当您更改用户名时,它会读取所有这些引用并更改此路径上的用户名,如下所示(Swift):

ref.child("users/profile").child(uid ?? "ERROR").child("comments/DE").observeSingleEvent(of: .value, with: { (recipes) in
   // recipe dict is a dictionary of all the references to recipes a user has commented
   let recipeDict = recipes.value as! [String:Any]
   // now every reference is being used to change the username at given place to the new username with variable "username"
   var updateObjects: [String:String] = [:]
   for i in recipeDict.keys {
      updateObjects["recipes/DE/\(i)/comments/\(uid ?? "ERROR")/username"] = username
   }
   // Now the changes stored in the "updateObjects" variable will be applied
   ref.updateChildValues(updateObjects)
})

现在这可行,但这种方法的问题是,说配方被删除,引用没有被删除(会很复杂,因为安全规则不允许更新其他用户配置文件,因此也不能更新他们的引用) . 所以这对我来说不是什么大不了的事,但由于“updateChildValues”函数会创建缺失的对象。最终发生的是,在删除配方所在的位置,创建了一个“新”空配方结构,除了评论之外没有任何其他节点。这会使我的应用程序崩溃,这不是我想要的。我怎样才能阻止这种情况发生?

当没有现有结构(配方已删除)时,您可以在不写入数据的情况下调用多路径更新吗?或者我是否需要删除所有评论引用并以某种方式让其他用户访问评论引用(这很乏味......)?

4

1 回答 1

0

如果写入只是用户名,您可以编写安全规则以拒绝对不存在的评论的写入操作。例如,假设每个评论的另一个属性是text,您可以这样做:

"comments": {
  "$commentid": {
    "$uid": {
      "username": {
        ".write": "data.parent.parent.child('text').exists()"
      }
    }
  }
}     

这样做的问题是多路径更新对所有这些更新的安全规则进行了一次大检查。因此,如果一个节点被删除,所有名称的更新都会失败。如果那是你想要的,我会去的。

于 2020-05-22T21:50:31.697 回答