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

How to append to a path with additional objects in Firebase?

我有这样的数据结构:

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"]
}

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

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

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

This will overwrite only children enumerated in the "value" parameter and will leave others untouched. Note that the update function is equivalent to calling set() on the named children; it does not recursively update children if they are objects. Passing null as a value for a child is equivalent to calling remove() on that child.

因此,对于 "update" 您的类别,您需要 运行 直接更新这些类别,而不是父类别:

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

如前所述,您将无法使用数组索引完成这种 activity。我们怎么知道我们实际上是哪一项 "updating"?如果另一个用户在数组中添加或删除一个项目,所有流畅的顺序键都会发生变化,我的更新现在不稳定且不可预测(请参阅我上面评论中的链接)。

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