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

使用快照数据更新Firebase节点,而不覆盖数据,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,我正在考虑将节点(例如/a/b/c)与节点/数据/c同步 节点/a/b/c上有数据-因此我只想抓取/data/c的快照,并将该数据放入/a/b/c,而不删除现有值 是否有这样一种方法: Ref.update({ snapshotdata.val() }).key; 这样行吗?我不确定firebase将如何解析快照,如果它获取整个内容并进行覆盖,或者获取单个值并进行添加 提前感

我正在考虑将节点(例如/a/b/c)与节点/数据/c同步

节点/a/b/c上有数据-因此我只想抓取/data/c的快照,并将该数据放入/a/b/c,而不删除现有值

是否有这样一种方法:

Ref.update({
                                snapshotdata.val()
                            }).key;
这样行吗?我不确定firebase将如何解析快照,如果它获取整个内容并进行覆盖,或者获取单个值并进行添加

提前感谢您的澄清

致以最良好的祝愿,
基兰

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

{
  name: 'old name',
  data: {
    gonnabe: 'gone'
  },
  created: 12345679
}
{
  name: 'new name',
  data: {
    nested: true
  },
  updated: 12345679
}
data/c
看起来像:

{
  name: 'old name',
  data: {
    gonnabe: 'gone'
  },
  created: 12345679
}
{
  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
}
请注意,
数据
中的嵌套字段已被更新删除,但未创建非嵌套字段

如果要进行深度更新,则需要为每个要更新的深度节点构造一个以斜杠分隔的字段的更新。因此,您可能需要:

{
  "name": "new name",
  "data/nested": true,
  "updated" 12345679
}
这将不会破坏嵌套数据,只会更新直接引用的值,从而导致:

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

希望有帮助

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

{
  name: 'old name',
  data: {
    gonnabe: 'gone'
  },
  created: 12345679
}
{
  name: 'new name',
  data: {
    nested: true
  },
  updated: 12345679
}
data/c
看起来像:

{
  name: 'old name',
  data: {
    gonnabe: 'gone'
  },
  created: 12345679
}
{
  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
}
请注意,
数据
中的嵌套字段已被更新删除,但未创建非嵌套字段

如果要进行深度更新,则需要为每个要更新的深度节点构造一个以斜杠分隔的字段的更新。因此,您可能需要:

{
  "name": "new name",
  "data/nested": true,
  "updated" 12345679
}
这将不会破坏嵌套数据,只会更新直接引用的值,从而导致:

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

希望有帮助

很好的回答,谢谢!很好的安排和解释。实际上,上面有一个问题;我假设快照中的唯一值不会破坏性地更新现有节点,对吗?e、 g./a/b/c{tokens{a:1,b:2}-/z/data/tokens{c:15}正确,更新将只覆盖传递给
update()的数据中指定的节点
因此,在您的示例中,
c
不会覆盖
令牌
。非常感谢。我的问题是,我试图将数千个节点从1-5个节点复制到一个节点(以准备推送通知)。通过循环添加它们更安全,但速度要慢得多。因此,我正在尝试找出一种不具破坏性且快速的方法。回答得很好,谢谢!布局和解释得很好。实际上,上面有一个问题;我是否正确地假设,对于快照中的唯一值,它不会破坏性地更新现有节点?例如/a/b/c{tokens{a:1,b:2}-/z/data/tokens{c:15}正确,更新只会覆盖在传递给
update()
的数据中指定的节点,因此在您的示例中,
c
不会覆盖
tokens
。非常感谢。我的问题是,我正在尝试将数千个节点从1-5个节点复制到一个节点(准备推送通知)。通过它循环添加它们更安全,但速度要慢得多。因此,我正在尝试找出一种不会造成破坏且快速的方法。