Firebase更新与设置


76

正如标题所说,我不能得到之间的区别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);
}

因此,也许应该对文档中的示例进行更新,因为现在它看起来像,update并且set做的完全相同。

亲切的问候,贝恩

Answers:


135

原子性

您提供的两个样本之间的最大区别是它们发送到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以及更新的title和仍然存在body


11
非常感谢您的回答。也许用一个更清晰的update方法示例来更新文档是一个好主意。
Bene

7
@ frank-van-puffelen听起来像update()goto的主力马,可以完成所有工作。您甚至可以使 update属性null有效地完成的相同工作remove。因此,有没有真正的充分理由使用set()?也许您是否要对数据进行一些严重的修整/重塑?
jmk2142

6
当然,需要对文档进行改进,以明确方式添加此答案中的信息。
Splaktar

对于离线情况,我发现'set'是有效的,因为一旦客户端上线,它将所有更改提交到Firebase数据库。当客户端返回联机模式时,“更新”未将所有未完成的更改提交到Firebase数据库。如果我错了,请纠正我。
Murtuza

更新创建新的数据域太@Frank工作?
Subrata sharma
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.