Firebase 更新与设置
Posted
技术标签:
【中文标题】Firebase 更新与设置【英文标题】:Firebase update vs set 【发布时间】:2016-12-19 19:16:32 【问题描述】:正如标题所说,我无法理解update
和set
之间的区别。文档也帮不了我,因为如果我改用 set,更新示例的工作原理完全相同。
文档中的update
示例:
function writeNewPost(uid, username, title, body)
var postData =
author: username,
uid: uid,
body: body,
title: title,
starCount: 0
;
var newPostKey = firebase.database().ref().child('posts').push().key;
var updates = ;
updates['/posts/' + newPostKey] = postData;
updates['/user-posts/' + uid + '/' + newPostKey] = postData;
return firebase.database().ref().update(updates);
同样的例子使用set
function writeNewPost(uid, username, title, body)
var postData =
author: username,
uid: uid,
body: body,
title: title,
starCount: 0
;
var newPostKey = firebase.database().ref().child('posts').push().key;
firebase.database().ref().child('/posts/' + newPostKey).set(postData);
firebase.database().ref().child('/user-posts/' + uid + '/' + newPostKey).set(postData);
所以也许应该更新文档中的示例,因为现在看起来 update
和 set
做了完全相同的事情。
亲切的问候, 福利
【问题讨论】:
【参考方案1】:原子性
您提供的两个示例之间的一大区别在于它们发送到 Firebase 服务器的写入操作数量。
在第一种情况下,您发送的是单个 update() 命令。整个命令要么成功,要么失败。例如:如果用户有/user-posts/' + uid
的发帖权限,但没有/posts
的发帖权限,则整个操作会失败。
在第二种情况下,您要发送两个单独的命令。使用相同的权限,现在写入/user-posts/' + uid
将成功,而写入/posts
将失败。
部分更新与完全覆盖
在此示例中,另一个区别不是立即可见的。但假设您正在更新现有帖子的标题和正文,而不是写新帖子。
如果您使用此代码:
firebase.database().ref().child('/posts/' + newPostKey)
.set( title: "New title", body: "This is the new body" );
您将替换整个现有帖子。所以原来的uid
、author
和starCount
字段将会消失,而只会有新的title
和body
。
另一方面,如果您使用更新:
firebase.database().ref().child('/posts/' + newPostKey)
.update( title: "New title", body: "This is the new body" );
执行此代码后,原始的uid
、author
和starCount
以及更新后的title
和body
仍然存在。
【讨论】:
非常感谢您的回答。也许用更新方法的更清晰示例来更新文档是个好主意。 @frank-van-puffelen 听起来update()
是可以做到这一切的goto 主力。您甚至可以将update
属性设置为null
... 有效地完成remove
的相同工作。那么,有什么真正好的理由使用set()
吗?如果您想对数据进行一些认真的修剪/重塑?
文档当然需要改进,以便以清晰的方式添加此答案中的信息。
update 是否也适用于创建新数据字段@Frank?
是的。试一试,如果您在使其适用于您的案例时遇到问题,请提出一个新问题。以上是关于Firebase 更新与设置的主要内容,如果未能解决你的问题,请参考以下文章