web-dev-qa-db-fra.com

Mise à jour de Firebase vs set

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

57
Bene

L'atomicité

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.

Mise à jour partielle vs écrasement complet

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.

108
Frank van Puffelen