Comme le titre le dit, je ne peux pas comprendre les différences entre update
et set
. De plus, la documentation ne peut pas m'aider, car l'exemple de mise à jour fonctionne exactement de la même manière si j'utilise set.
L'exemple update
tiré de la documentation:
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);
}
Le même exemple utilisant 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);
}
Donc, peut-être que l’exemple de la documentation devrait être mis à jour, car il ressemble maintenant à update
et set
font exactement la même chose.
Cordialement, Bene
Une grande différence entre les deux exemples que vous avez donnés concerne le nombre d'opérations d'écriture envoyées aux serveurs Firebase.
Dans le premier cas, vous envoyez une seule commande update (). Toute cette commande réussira ou échouera. Par exemple: si l'utilisateur a l'autorisation de publier sur /user-posts/' + uid
, mais n'a pas l'autorisation de publier sur /posts
, l'opération entière échouera.
Dans le second cas, vous envoyez deux commandes distinctes. Avec les mêmes autorisations, l'écriture sur /user-posts/' + uid
réussira à présent, tandis que l'écriture sur /posts
échouera.
Une autre différence n'est pas immédiatement visible dans cet exemple. Mais dites que vous mettez à jour le titre et le corps d'un message existant, au lieu d'écrire un nouveau message.
Si vous utilisiez ce code:
firebase.database().ref().child('/posts/' + newPostKey)
.set({ title: "New title", body: "This is the new body" });
Vous seriez en train de remplacer l'intégralité du poste existant. Ainsi, les champs uid
, author
et starCount
d'origine auraient disparu et il ne resterait que les nouveaux title
et body
.
Si par contre vous utilisez une mise à jour:
firebase.database().ref().child('/posts/' + newPostKey)
.update({ title: "New title", body: "This is the new body" });
Après avoir exécuté ce code, les uid
, author
et starCount
d'origine seront toujours présents, de même que les title
et body
mis à jour.