正如标题所说,我无法区分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
做同样的事情。
亲切的问候, 好处
答案 0 :(得分:102)
您给出的两个示例之间的一个重要区别在于它们发送到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
。