使用快照数据更新Firebase节点而不覆盖数据

时间:2018-03-06 01:46:29

标签: firebase firebase-realtime-database

我正在寻找同步节点,例如/ a / b / c with node / data / c

节点/ a / b / c上有数据 - 所以我只想获取/ data / c的快照并将数据放入/ a / b / c而不删除现有值。

会采用以下方式:

Ref.update({
                                snapshotdata.val()
                            }).key;

这会有用吗?我不确定firebase如何解析快照,如果它需要整个事情并覆盖它,或者需要单个值并添加。

提前感谢您的清晰。

最诚挚的问候, 基兰

1 个答案:

答案 0 :(得分:1)

这取决于。快照值只是JSON对象(或原语,具体取决于节点)。 update()将替换更新中的键指定的任何节点,但不会替换任何不是。如果/a/b/c看起来像:

{
  name: 'old name',
  data: {
    gonnabe: 'gone'
  },
  created: 12345679
}

data/c看起来像:

{
  name: 'new name',
  data: {
    nested: true
  },
  updated: 12345679
}

执行db.ref('a/b/c').update(dataSnapshot.val())会导致:

{
  name: 'new name',
  data: {
    nested: true
  },
  created: 12345679,
  updated: 12345679
}

请注意,data中的嵌套字段已被更新删除,但非嵌套字段created未被删除。

如果要进行深度更新,则需要为要更新的每个深层节点构建一个带斜杠分隔字段的更新。因此,除了上述内容之外,您可能还有:

{
  "name": "new name",
  "data/nested": true,
  "updated" 12345679
}

这对嵌套数据是非破坏性的,只更新直接引用的值,导致:

{
  name: 'new name',
  data: {
    gonnabe: 'gone',
    nested: true
  },
  created: 12345679,
  updated: 12345679
}

希望有所帮助!