如何在 Firebase 中附加到带有其他对象的路径?

Posted

技术标签:

【中文标题】如何在 Firebase 中附加到带有其他对象的路径?【英文标题】:How to append to a path with additional objects in Firebase? 【发布时间】:2015-02-16 08:04:29 【问题描述】:

我有这样的数据结构:

karmadots/events = 


  "event1": 
    "categories" : ["fun"],
    "name": "Some Title"
  

我希望能够附加到类别并使其具有 ["fun", "outside"]。我怎样才能做到这一点?当我更新事件路径上的子值时,整个类别路径都会重置。

编辑:

    @IBAction func acceptUser(sender: AnyObject) 

    //  eventRef = karmadots/events (above)
    var myRef = eventRef.childByAppendingPath("event1")
    var eventDataOne = [
        "categories":["fun"]
    ]
    myRef.updateChildValues(eventDataOne)

    // categories = ["fun"]

    var eventDataTwo = [
        //I want to be able to append to categories instead of overwriting
        "categories":["outside"]
    ]
    myRef.updateChildValues(eventDataTwo)

    // categories = ["outside"] BUT I want it to be ["fun", "outside"]

我希望能够在第二次通话时附加到类别。

【问题讨论】:

听起来你已经尝试了一些东西。如果是这样,请编辑您的问题以包含您尝试过的代码。 首先,数组在实时分布式数据中存在问题[1]、[2]。其次,此示例没有说明standbyRef 的来源,您的示例数据也不包含任何具有inviteeUserID 的结构。当问题支离破碎且示例具有误导性时,将很难提供任何建议。见How to create a Minimal, Complete, and Verifiable example @Kato 抱歉,更新了原帖。 【参考方案1】:

更新不是深度递归合并。从 API 文档中查看此简介以进行更新:

这将仅覆盖“value”参数中枚举的子项 并且不会影响其他人。注意更新函数是 相当于在命名的孩子上调用 set() ;它不是 如果孩子是对象,则递归更新它们。将 null 作为 一个孩子的价值相当于在那个孩子上调用 remove()。

因此,要“更新”您的类别,您需要直接在这些类别而不是父类别上运行更新:

var myRef = eventRef.childByAppendingPath("event1/categories");
myRef.updateChildValues("one": 1);
myRef.updateChildValues("two": 2);

如前所述,您将无法使用数组索引来完成此类活动。我们如何知道我们实际上正在“更新”哪个项目?如果另一个用户从数组中添加或删除一个项目,所有流动的、连续的键都已更改,我的更新现在不稳定且不可预测(请参阅上面我的 cmets 中的链接)。

相反,您可能希望在这里使用childByAutoId。这在保存数据的指南中有介绍。有一个entire section dedicated to saving lists 涵盖了您在这里遇到的所有陷阱以及正确的解决方案。

【讨论】:

【参考方案2】:

您可能正在使用 firebase 函数 $set,它将该节点上的所有内容替换为新数据。尝试改用$push,这会将新数据附加到现有数据中。

【讨论】:

以上是关于如何在 Firebase 中附加到带有其他对象的路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase 中实现基于角色的访问控制

带有进度条的 Firebase 数据库

带有进度条的Firebase数据库

如何使用nodejs在对话流履行中将数据附加到firebase?

本地写入带有附加侦听器的 Firebase RTDB 或 Firestore 是不是需要读取操作?

带有对象的角度材质多选选项