Ich versuche gerade Firestore und stecke bei etwas sehr Einfachem fest: "Aktualisieren eines Arrays (auch bekannt als Unterdokument)".
Meine DB-Struktur ist super einfach. Beispielsweise:
proprietary: "John Doe",
sharedWith:
[
{who: "[email protected]", when:timestamp},
{who: "[email protected]", when:timestamp},
],
Ich versuche (ohne Erfolg), neue Datensätze in eine shareWith
Reihe von Objekten zu verschieben.
Ich habe es versucht:
// With SET
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
{ sharedWith: [{ who: "[email protected]", when: new Date() }] },
{ merge: true }
)
// With UPDATE
firebase.firestore()
.collection('proprietary')
.doc(docID)
.update({ sharedWith: [{ who: "[email protected]", when: new Date() }] })
Keiner funktioniert. Diese Abfragen überschreiben mein Array.
Die Antwort mag einfach sein, aber ich konnte sie nicht finden ...
quelle
arrayUnion
Methode.Firestore verfügt jetzt über zwei Funktionen, mit denen Sie ein Array aktualisieren können, ohne das gesamte Objekt neu schreiben zu müssen.
Link: https://firebase.google.com/docs/firestore/manage-data/add-data , insbesondere https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array
quelle
Sie können eine Transaktion ( https://firebase.google.com/docs/firestore/manage-data/transactions ) verwenden, um das Array abzurufen, darauf zu übertragen und dann das Dokument zu aktualisieren:
quelle
documentReference
HinzufügenuserRef
wie gezeigt fehlt :transaction.set(userRef, { bookings: [booking] });
Hier ist das neueste Beispiel aus der Firestore-Dokumentation:
firebase.firestore.FieldValue. ArrayUnion
quelle
Tut mir leid, dass ich zu spät zum Feiern gekommen bin, aber Firestore hat es bereits im August 2018 gelöst. Wenn Sie hier noch danach suchen, sind alle Probleme in Bezug auf Arrays gelöst.
https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html Offizieller Blogbeitrag
array-enthält, arrayRemove, arrayUnion zum Überprüfen, Entfernen und Aktualisieren von Arrays. Ich hoffe es hilft.
quelle
Um auf Sam Sterns Antwort aufzubauen , gibt es auch eine dritte Option, die mir die Arbeit erleichtert hat, nämlich die Verwendung einer von Google als Map bezeichneten Karte, bei der es sich im Wesentlichen um ein Wörterbuch handelt.
Ich denke, ein Wörterbuch ist weitaus besser für den Anwendungsfall, den Sie beschreiben. Normalerweise verwende ich Arrays für Dinge, die nicht wirklich zu stark aktualisiert werden, daher sind sie mehr oder weniger statisch. Aber für Dinge, die viel geschrieben werden, insbesondere Werte, die für Felder aktualisiert werden müssen, die mit etwas anderem in der Datenbank verknüpft sind, erweisen sich Wörterbücher als viel einfacher zu pflegen und zu bearbeiten.
Für Ihren speziellen Fall würde die DB-Struktur also folgendermaßen aussehen:
Auf diese Weise können Sie Folgendes tun:
Der Grund für die Definition des Objekts als Variable besteht darin, dass die Verwendung
'sharedWith.' + whoEmail + '.when'
direkt in der set-Methode zu einem Fehler führt, zumindest wenn es in einer Node.js-Cloud-Funktion verwendet wird.quelle
Andere als die oben genannten Antworten. Das wird es tun. Verwenden von Angular 5 und AngularFire2. oder verwenden Sie firebase.firestore () anstelle von this.afs
quelle
Betrachten Sie John Doe eher als ein Dokument als als eine Sammlung
Geben Sie ihm eine Sammlung von Dingen und Dingen, die mit anderen geteilt werden
Anschließend können Sie die gemeinsam genutzten Dinge von John Doe in dieser parallelen Sammlung von thingsSharedWithOthers zuordnen und abfragen.
quelle
Wenn jemand nach einer Java Firestore SDK-Lösung sucht, um Elemente im Array-Feld hinzuzufügen:
So löschen Sie Elemente aus dem Array-Benutzer:
FieldValue.arrayRemove()
quelle
So habe ich es zum Laufen gebracht. Hoffe, es hilft euch allen, da ich es als eine viel bessere Lösung sehe. Hier möchte ich den Aufgabenstatus von open (close = false) in close (close = true) ändern, während alles andere im Objekt gleich bleibt.
und hier ist der Dienst, der es tatsächlich aktualisiert
quelle