Ich erkunde gerade den neuen Firebase Firestore und er enthält einen Datentyp namens reference
. Mir ist nicht klar, was das bewirkt.
- Ist es wie ein Fremdschlüssel?
- Kann damit auf eine Sammlung verwiesen werden, die sich an einer anderen Stelle befindet?
- Wenn
reference
es sich um eine tatsächliche Referenz handelt, kann ich sie für Abfragen verwenden? Kann ich beispielsweise eine Referenz haben, die direkt auf den Benutzer verweist, anstatt die Benutzer-ID in einem Textfeld zu speichern? Und kann ich diese Benutzerreferenz zum Abfragen verwenden?
firebase
google-cloud-firestore
Jürgen Brandstetter
quelle
quelle
Antworten:
Referenzen sind Fremdschlüsseln sehr ähnlich.
Die aktuell veröffentlichten SDKs können keine Verweise auf andere Projekte speichern. Innerhalb eines Projekts können Verweise auf jedes andere Dokument in einer anderen Sammlung verweisen.
Sie können Referenzen in Abfragen wie jeden anderen Wert verwenden: zum Filtern, Ordnen und zum Paging (startAt / startAfter).
Im Gegensatz zu Fremdschlüsseln in einer SQL-Datenbank sind Referenzen nicht hilfreich, um Verknüpfungen in einer einzelnen Abfrage durchzuführen. Sie können sie für abhängige Suchvorgänge verwenden (die wie Joins aussehen), aber seien Sie vorsichtig, da jeder Hop zu einem weiteren Roundtrip zum Server führt.
quelle
friends
Sammlung, in der alle meine Freunde aufgelistet sind (friends/myId
). Dann verweise ich auf dieses Dokument imfriends
Feld eines anderen Dokuments (group/groupId
). Ich möchte nur meine Freunde anzeigen, die zu dieser Gruppe gehören und so etwas tun :where('friends.myId', '==', true)
.Fügen Sie unten hinzu, was für mich unter Verwendung von Referenzen in Firestore funktioniert hat.
Wie die anderen Antworten sagen, ist es wie ein Fremdschlüssel. Das Referenzattribut gibt jedoch nicht die Daten des Referenzdokuments zurück. Zum Beispiel habe ich eine Liste von Produkten mit einer userRef-Referenz als eines der Attribute des Produkts. Wenn ich die Liste der Produkte erhalte, erhalte ich die Referenz des Benutzers, der das Produkt erstellt hat. Aber es gibt mir nicht die Details des Benutzers in dieser Referenz. Ich habe zuvor ein anderes Back-End als Dienste mit Zeigern verwendet, die ein "populate: true" -Flag haben, das die Benutzerdetails zurückgibt, anstatt nur die Referenz-ID des Benutzers, was hier großartig wäre (hoffentlich eine zukünftige Verbesserung) ).
Im Folgenden finden Sie einen Beispielcode, mit dem ich die Referenz festgelegt sowie die Produktkollektionsliste abgerufen und dann die Benutzerdetails aus der angegebenen Benutzerreferenz-ID abgerufen habe.
Legen Sie eine Referenz für eine Sammlung fest:
Holen Sie sich eine Sammlung (Produkte) und alle Referenzen zu jedem Dokument (Benutzerdetails):
Hoffe das hilft
quelle
db.collection('products').get()
. Haben Sie versucht, Benutzer direkt zu bekommen? IchnewItem.userRef.get()
db.collection("users").doc(newItem.userRef.id).get()
uid
und die Referenz darüber speichert .reference
wenn wir es nicht als echten Fremdschlüssel verwenden können?reference
gegenüber astring
ist, dass Sieget()
die Referenz direkt aufrufen können. Noch nicht sehr nützlich. Hoffe, sie fügen eine Option hinzu, um Referenzen automatisch mit den entsprechenden Objekten zu füllen!Für diejenigen, die nach einer Javascript-Lösung für die Abfrage nach Referenz suchen, besteht das Konzept darin, dass Sie in der Abfrageanweisung ein 'Dokumentreferenz'-Objekt verwenden müssen
(Ein großes Lob an die Antwort hier: https://stackoverflow.com/a/53141199/1487867 )
quelle