Reputation: 1122
As the title says, I can't get the differences between update
and set
. Also the docs can't help me, as the update example works exactly the same if I use set instead.
The update
example from the docs:
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);
}
The same example using 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);
}
So maybe the example from the docs should be updated, because now it looks like update
and set
do the exact same thing.
Kind regards, Bene
Upvotes: 112
Views: 102438
Reputation: 598728
One big difference between the two samples you've given is in the number of write operations they send to the Firebase servers.
In the first case, you're sending a single update() command. That entire command will either succeed or fail. For example: if the user has permission to post to /user-posts/' + uid
, but doesn't have permission to post to /posts
, the entire operation will fail.
In the second case, you're sending two separate commands. With the same permissions, the write to /user-posts/' + uid
will now succeed, while the write to /posts
will fail.
Another difference is not immediately visible in this example. But say that you're updating the title and body of an existing post, instead of writing a new post.
If you'd use this code:
firebase.database().ref().child('/posts/' + newPostKey)
.set({ title: "New title", body: "This is the new body" });
You'd be replacing the entire existing post. So the original uid
, author
and starCount
fields would be gone and there'll just be the new title
and body
.
If on the other hand you use an update:
firebase.database().ref().child('/posts/' + newPostKey)
.update({ title: "New title", body: "This is the new body" });
After executing this code, the original uid
, author
and starCount
will still be there as well as the updated title
and body
.
Upvotes: 188