如何在 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 中附加到带有其他对象的路径?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用nodejs在对话流履行中将数据附加到firebase?