Firebase Update vs Set

74

Wie der Titel schon sagt, kann ich die Unterschiede zwischen updateund nicht erkennen set. Auch die Dokumente können mir nicht helfen, da das Update-Beispiel genauso funktioniert, wenn ich stattdessen set verwende.

Das updateBeispiel aus den Dokumenten:

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);
}

Das gleiche Beispiel mit 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);
}

Vielleicht sollte das Beispiel aus den Dokumenten aktualisiert werden, denn jetzt sieht es so aus updateund setmacht genau das Gleiche.

Herzliche Grüße, Bene

Bene
quelle

Antworten:

133

Atomizität

Ein großer Unterschied zwischen den beiden von Ihnen angegebenen Beispielen besteht in der Anzahl der Schreibvorgänge, die sie an die Firebase-Server senden.

Im ersten Fall senden Sie einen einzelnen Befehl update (). Dieser gesamte Befehl ist entweder erfolgreich oder schlägt fehl. Beispiel: Wenn der Benutzer die Berechtigung zum Posten hat /user-posts/' + uid, aber keine Berechtigung zum Posten hat, schlägt /postsder gesamte Vorgang fehl.

Im zweiten Fall senden Sie zwei separate Befehle. Mit denselben Berechtigungen ist das Schreiben in /user-posts/' + uidnun erfolgreich, während das Schreiben in /postsfehlschlägt.

Teilaktualisierung vs. vollständiges Überschreiben

Ein weiterer Unterschied ist in diesem Beispiel nicht sofort sichtbar. Angenommen, Sie aktualisieren den Titel und den Text eines vorhandenen Beitrags, anstatt einen neuen Beitrag zu schreiben.

Wenn Sie diesen Code verwenden würden:

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

Sie würden den gesamten vorhandenen Beitrag ersetzen. So das Original uid, authorund starCountFelder wäre weg , und es werden Ihnen nur die neuen titleund body.

Wenn Sie andererseits ein Update verwenden:

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

Nach dem Ausführen dieses Codes, die ursprünglichen uid, authorund starCountwird noch da sein sowie die Aktualisierung titleund body.

Frank van Puffelen
quelle
10
Vielen Dank für die Antwort. Vielleicht wäre es eine gute Idee, die Dokumente mit einem klareren Beispiel für die Aktualisierungsmethode zu aktualisieren.
Bene
7
@ frank-van-puffelen Klingt so, als wäre update()es das Arbeitspferd, das alles kann. Sie können sogar updateEigenschaften, um null... effektiv den gleichen Job zu machen remove. Gibt es damit überhaupt einen guten Grund set()? Vielleicht, wenn Sie Daten ernsthaft zuschneiden / umformen möchten?
jmk2142
6
Die Dokumente müssen sicherlich verbessert werden, um die Informationen aus dieser Antwort auf klare Weise hinzuzufügen.
Splaktar
In einer Offline-Situation stellte ich fest, dass 'set' effizient ist, da alle Änderungen an der Firebase-Datenbank festgeschrieben werden, sobald der Client online ist. Während 'Update' nicht alle ausstehenden Änderungen an der Firebase-Datenbank festschrieb, als der Client in den Online-Modus zurückkehrte. Bitte korrigieren Sie mich, wenn ich falsch liege.
Murtuza
Funktioniert das Aktualisieren auch zum Erstellen eines neuen Datenfelds @Frank?
Subrata Sharma