Unterschied zwischen Set mit {merge: true} und Update

115

Im Cloud Firestore gibt es drei Schreibvorgänge:

1) hinzufügen

2) einstellen

3) aktualisieren

In den Dokumenten heißt es, dass mit using set(object, {merge: true})das Objekt mit dem vorhandenen zusammengeführt wird.

Das gleiche passiert, wenn Sie verwenden. update(object) Was ist also der Unterschied, wenn überhaupt? Es scheint seltsam, dass Google die Logik dupliziert.

ZuzEL
quelle

Antworten:

260

So wie ich den Unterschied verstanden habe:

  • setohne mergewird ein Dokument überschreiben oder erstellen, wenn es noch nicht existiert

  • setwith mergeaktualisiert Felder im Dokument oder erstellt sie, wenn sie nicht vorhanden sind

  • update aktualisiert Felder, schlägt jedoch fehl, wenn das Dokument nicht vorhanden ist

  • create erstellt das Dokument, schlägt jedoch fehl, wenn das Dokument bereits vorhanden ist

Es gibt auch einen Unterschied in der Art der Daten , die Sie auf setund update.

Denn setSie müssen immer dokumentenförmige Daten bereitstellen:

set(
  {a: {b: {c: true}}},
  {merge: true}
)

Mit können updateSie auch Feldpfade zum Aktualisieren verschachtelter Werte verwenden:

update({
  'a.b.c': true
})
Scarygami
quelle
1
Aber wo haben Sie die createMethode in der API gefunden?
ZuzEL
2
cloud.google.com/nodejs/docs/reference/firestore/0.8.x/… für node.js. Es scheint, dass die Web-API diese Methode nicht hat. War nicht sicher, auf welcher Plattform du bist :)
Scarygami
10
Eine weitere Unterscheidung, die Sie erwähnen können, besteht darin, dass setdokumentförmige Daten verarbeitet werden, bei denen updateFeldpfad- und Wertepaare verwendet werden. Dies bedeutet, dass Sie Änderungen an tief verschachtelten Werten vornehmen können update, die umständlicher sind set. Zum Beispiel: set({a: {b: {c: true}}}, {merge: true})vs update('a.b.c', true).
Gil Gilbert
Wenn ich einen Wert in einem Dokument aktualisieren möchte, ist es sinnvoll, bereits vorhandene Dokumente zu aktualisieren. Daher denke ich, dass set + fusioneall nicht so nützlich ist, da es erstellt, dass das Dokument nicht vorhanden ist
John Balvin Arias
Wenn Daten, die Sie dem Befehl set zur Verfügung stellen, ein Feld haben, das null ist, wird das Feld dann auf null gesetzt, wenn es bereits in der Datenbank vorhanden ist, oder wird es in Ruhe gelassen?
user1023110
71

Ein weiterer Unterschied (Erweiterung der Antwort von Scarygami) zwischen "Mit Zusammenführung festlegen" und "Aktualisieren" besteht darin, mit verschachtelten Werten zu arbeiten.

Wenn Sie ein Dokument wie folgt strukturiert haben:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
   }
 }

und möchte hinzufügen {"friend-uid-3" : true}

mit diesem:

db.collection('users').doc('random-id').set({ "friends": { "friend-uid-3": true } },{merge:true})

führt zu diesen Daten:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
     "friend-uid-3": true
   }
 }

updateVerwenden Sie jedoch Folgendes:

db.collection('users').doc('random-id').update({ "friends": { "friend-uid-3": true } })

führt zu diesen Daten:

 `{
   "friends": {
     "friend-uid-3": true
   }
 }`
Finlay Percy
quelle
1
Haben Sie versucht, dies selbst zu testen? Es gibt einen Abschnitt in der Dokumentation: "Um einige Felder eines Dokuments zu aktualisieren, ohne das gesamte Dokument zu überschreiben, verwenden Sie die update () -Methode ..." Link
Finlay Percy
2
Ich habe es herausgefunden. Ich habe das vorher nur mit einem Array versucht. Wo ich dem Array ein Objekt hinzufügen wollte und alles für dieses Array überschrieben wurde. Es funktioniert nicht mit Feldern, die ein Array enthalten ... es steht für Dokumente.
Ravo10
1
Bin gerade nach den Tests zu dem gleichen Schluss gekommen. Ich hoffe, sie werden eine Option hinzufügen, die den gleichen Effekt wie { merge: true }die Update-Funktion hat.
Johnride
1
Danke für diese Antwort! Die Beispiele, obwohl einfach, machten es sauberer als die akzeptierte Antwort, die für meinen Anwendungsfall besser war.
naiveai
2
Um zu vermeiden, dass Daten in verschachtelten Feldern (wie in der obigen Antwort) überschrieben werden update, können Sie die Punktnotation verwenden . Das Überschreibverhalten von updateist anders, wenn Sie die Punktnotation verwenden / nicht verwenden.
Tedskovsky
7

Pro Dokument: https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects

Mit der Punktnotation können Sie ein einzelnes verschachteltes Feld aktualisieren, ohne ein anderes verschachteltes Feld zu überschreiben. Wenn Sie ein verschachteltes Feld ohne Punktnotation aktualisieren, überschreiben Sie das gesamte Kartenfeld.

Wie oben erwähnt, ersetzt dies die gesamte Freundesstruktur.

db.collection('users').doc('random-id').update({
    "friends": {
        "friend-uid-3": true
    }
})

Das tut nicht.

db.collection('users').doc('random-id').update({
    "friends.friend-uid-3": true
})
CodeManDan
quelle