如何在不覆盖孩子的情况下进行更新?

时间:2018-07-03 18:37:16

标签: firebase firebase-realtime-database

考虑Firebase实时数据库中的现有数据

db.ref('path/to/child').once('value')

{
  "data":{
    "this":"value",
    "that":"value"
  }
}

将此设置操作视为原始数据

db.ref('path/to/child').update({"data":{"this":"newValue"}})

{
  "data":{
    "this":"newValue",
  }
}

我们如何执行更新以保留未更改的数据

db.ref('path/to/child').foo({"data":{"this":"newValue"}})

{
  "data":{
    "this":"newValue",
    "that":"value"
  }
}

2 个答案:

答案 0 :(得分:2)

现在,您的代码告诉Firebase更新data下的整个 path/to/child子级。相反,您应该引用要更新的最终子节点的最深层路径:

db.ref('path/to/child/data').update({"this":"newValue"})

请注意,我将data放在了引用中,而不是要更新的对象中。

答案 1 :(得分:0)

我遇到了同样的问题,但上面的示例不起作用。我根据同样无效的文档得出了同样的结论。它仍然覆盖了“数据”中的内容。

在数据(在我的情况下是对象键)后用斜杠测试对我有用。也许我仍然误解了它是如何工作的,但我想我会添加这个以防其他人遇到同样的问题。如果我错了,请解释。

这确实按我的预期工作。

db.rev('path/to/child/data/').update({"this": "newValue")
// almost exact path I use on some random test data
// path -> root/userid/list/listid/

db.rev('user/2FsJBrxZHQFff61QkMIuTV49KBUcQ2/list/MOwh_FwDmlKbxsfUmZS/').update({"name": "newValue")