Firebase 更新与设置

IT技术 javascript firebase firebase-realtime-database
2021-02-19 18:18:30

正如标题所说,我不能得到之间的区别updateset此外,文档也帮不了我,因为如果我使用 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);
}

所以也许文档中的例子应该更新,因为现在它看起来updateset做完全一样的事情。

亲切的问候,贝内

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, authorandstarCount字段将消失,只剩下新的titleand body

另一方面,如果您使用更新:

firebase.database().ref().child('/posts/' + newPostKey)
        .update({ title: "New title", body: "This is the new body" });

执行此代码后,原始uid,authorstarCount将仍然存在以及更新的titlebody

这些文档当然需要改进以清晰地添加来自此答案的信息。
2021-04-21 18:18:30
@frank-van-puffelen 听起来像是update()可以做到这一切的主力军。您甚至 update可以将属性null...有效地执行remove. 那么,有什么真正的充分理由可以使用set()吗?也许如果您想对数据进行一些认真的修剪/重塑?
2021-04-25 18:18:30
是的,它确实。尝试一下,如果您在使其适用于您的案例时遇到问题,请打开一个新问题。
2021-04-28 18:18:30
更新创建新的数据域太@Frank工作?
2021-05-04 18:18:30
非常感谢您的回答。也许用更清晰的更新方法示例更新文档是个好主意。
2021-05-08 18:18:30