Firebase更新与设置

时间:2016-08-12 17:38:09

标签: javascript firebase firebase-realtime-database

正如标题所说,我无法区分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 个答案:

答案 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" });

您将替换整个现有帖子。因此,原来的uidauthorstarCount字段将会消失,只有新的titlebody

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

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

执行此代码后,原始的uidauthorstarCount仍将存在,并且已更新titlebody