updateChildValue 写入数据

Posted

技术标签:

【中文标题】updateChildValue 写入数据【英文标题】:updateChildValue writes data 【发布时间】:2020-05-22 20:56:07 【问题描述】:

有以下问题:

我在我的实时 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”函数会创建缺失的对象。最终发生的是,在删除配方所在的位置,创建了一个“新”空配方结构,除了评论之外没有任何其他节点。这会使我的应用程序崩溃,这不是我想要的。我怎样才能阻止这种情况发生?

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢您的意见。尝试了此选项,但在删除分号后不断收到“无效的属性访问:目标不是对象”错误,因为它导致“预期的','或''”。但无论如何,我认为遵循这条路线没有意义,因为我不希望它无法更新其他用户名。你会如何建议攻击这个?目标:更新所有用户名,但这样做不会创建新结构(或阻止它发生) 我会迭代更新它们,而不是在单个多位置更新中。另见***.com/questions/30693785/… 好吧,这个 sortByChild 查询是个好主意,但是我不能真正做到这一点,因为我有很多食谱,我必须检查所有不确定数量的用户名的 cmets。这不能通过 sortByChild 解决,可以吗?另一方面,另一种非常低效的方法是检查索引上的所有配方是否存在,如果存在,则通过多路径更新它们。您会建议这样做还是有其他想法?

以上是关于updateChildValue 写入数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 updateChildValues 更新 childByAutoId

firebase - 在多个位置进行原子删除

updateChildValues 似乎不仅更新值

iOS 中的 Firebase updateChildValues,还有啥更优化的?

5.ElasticSearch数据写入与删除

向XML中写入数据