Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ref.update()删除省略的键-与.set()类似?_Javascript_Firebase Realtime Database - Fatal编程技术网

Javascript ref.update()删除省略的键-与.set()类似?

Javascript ref.update()删除省略的键-与.set()类似?,javascript,firebase-realtime-database,Javascript,Firebase Realtime Database,我正在尝试使用Firebase realtime database.update()根据更新数据节点。我使用.update()有选择地只更新该位置的引用键,而不是替换该位置的所有键 我的问题是,我从更新对象中省略了键“createdAt”,因为我不希望在初始创建后更新“createdAt”-但是在使用.update()时,“createdAt”键会被删除(゚ペ) 数据库结构 { "data": { "notifyByEmail": false, "notifyByPush"

我正在尝试使用Firebase realtime database.update()根据更新数据节点。我使用.update()有选择地只更新该位置的引用键,而不是替换该位置的所有键

我的问题是,我从更新对象中省略了键“createdAt”,因为我不希望在初始创建后更新“createdAt”-但是在使用.update()时,“createdAt”键会被删除(゚ペ)

数据库结构

{
  "data": {
    "notifyByEmail": false,
    "notifyByPush": false,
    "notifyBySms": false
  },
  "access/members": {
    "1234567890": true,
    "0987654321": true
  }
}
console.log('api', `${myPath}/${id}`, dbUpdateObj)
database.ref(`${myPath}/${id}`).update(dbUpdateObj).then(() => {   
  resolve({id, reduxStoreObj})
})

对象发送到更新()

代码

{
  "data": {
    "notifyByEmail": false,
    "notifyByPush": false,
    "notifyBySms": false
  },
  "access/members": {
    "1234567890": true,
    "0987654321": true
  }
}
console.log('api', `${myPath}/${id}`, dbUpdateObj)
database.ref(`${myPath}/${id}`).update(dbUpdateObj).then(() => {   
  resolve({id, reduxStoreObj})
})
日志记录

api categories/-LqXvFkeF_QfA5oHquYp [+] Object { data: {…}, "access/members": {…} }
结果

为什么删除了“createdAt”?我想.update()应该只更新定义的键,而不接触省略的键

我错过了什么

/K

您可以将
.set()
{merge:true}
选项一起使用,以避免(未更改的)数据被新数据替换


请参阅:

调用
update
就像对传入的每个属性分别调用
set
。因此在您的示例中,
数据和
访问/成员
被完全替换,但
数据库.ref(`${myPath}/${id}')
下的所有其他属性保持不变

如果要更新更深层次的属性,请在更新映射中包含它们的整个路径。因此,要维护
data/createdAt
,请指定要更新的
notify…
属性的整个路径:

{
  "data/notifyByEmail": false,
  "data/notifyByPush": false,
  "data/notifyBySms": false,
  "access/members": {
    "1234567890": true,
    "0987654321": true
  }
}

我发现在这样的多路径更新语句中,最常见的是有一个完整路径的平面图。因此,为了维护
access/members
的现有成员,上述内容将变为:

{
  "data/notifyByEmail": false,
  "data/notifyByPush": false,
  "data/notifyBySms": false,
  "access/members/1234567890": true,
  "access/members/0987654321": true
}

您好@tobias!谢谢您的回复。这不是云Firestore独有的吗?我使用的是实时数据库。抱歉,我不明白,合并选项仅适用于Firestore。如果您刚刚开始使用,我建议您使用Firestore而不是Firebase RTDB。谢谢!我已经评估了这两个选项,并且已经有了一个大型项目库非常感谢弗兰克!一如既往-平面图是解决方案的一部分。;)