2017-10-04 5 views
49

Ich erkunde gerade den neuen Firebase Firestore und enthält einen Datentyp namens reference. Es ist mir nicht klar, was das bedeutet.Was ist Firestore Referenz-Datentyp gut für?

  • Ist es wie Fremdschlüssel?
  • Kann es verwendet werden, um auf eine Sammlung zu verweisen, die sich woanders befindet?
  • Wenn reference eine tatsächliche Referenz ist, kann ich es für Abfragen verwenden? Kann ich zum Beispiel eine Referenz haben, die direkt auf den Benutzer zeigt, anstatt die userId in einem Textfeld zu speichern? Und kann ich diese Benutzerreferenz für die Abfrage verwenden?

Antwort

26

Referenzen sind sehr ähnlich wie Fremdschlüssel.

Die derzeit veröffentlichten SDKs können keine Referenzen auf andere Projekte speichern. Innerhalb eines Projekts können Verweise auf ein beliebiges anderes Dokument in einer anderen Sammlung verweisen.

Sie können Referenzen in Abfragen wie jedem anderen Wert verwenden: zum Filtern, Bestellen und zum Paging (startAt/startAfter).

Im Gegensatz zu Fremdschlüsseln in einer SQL-Datenbank sind Verweise für das Ausführen von Joins in einer einzelnen Abfrage nicht hilfreich. Sie können sie für abhängige Lookups verwenden (die scheinbar ähnlich aussehen), aber seien Sie vorsichtig, denn jeder Hop führt zu einem weiteren Umlauf zum Server.

+6

Bitte, können Sie mögliche Anwendungsfälle teilen? Ist es möglich Felder in dieser Referenz abzufragen? Z.B. Ich habe eine 'Freunde'-Sammlung, die alle meine Freunde auflistet (' friends/myId'). Dann referenziere ich dieses Dokument im Feld "Freunde" eines anderen Dokuments ("group/groupId"). Ich möchte nur meine Freunde anzeigen, die sich in dieser Gruppe befinden, etwa so: 'where ('friends.myId', '==', true)'. – Will

+45

Btw, es könnte nützlich sein, die [docs] (https://firebase.google.com/docs/firestore/manage-data/add-data) zu aktualisieren, um ein Beispiel zum Hinzufügen eines Referenztyps hinzuzufügen. – Will

+6

Ich kann keine Informationen darüber finden? Dies wird meine gesamte Datenbankstruktur verändern, ich muss mehr wissen ... – Ruben

15

Hinzufügen unter was für mich funktioniert mit Referenzen in Firestore.

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 einem userRef-Verweis als eines der Attribute auf dem Produkt. Die Liste der Produkte erhalten, gibt mir die Referenz des Benutzers, der dieses Produkt erstellt hat. Aber es gibt mir nicht die Details des Benutzers in dieser Referenz. Ich habe andere Back-End als Dienste mit Zeigern zuvor verwendet, die ein "populate: true" -Flag haben, das die Benutzerdetails zurückgibt, anstatt nur die Referenz-ID des Benutzers, was hier toll wäre (hoffentlich eine zukünftige Verbesserung)).

Unten ist ein Beispielcode, den ich verwendet habe, um die Referenz zu setzen, sowie die Sammlung von Produktlisten zu erhalten und dann die Benutzerdetails von der angegebenen Benutzer-Referenz-ID abzurufen.

einen Verweis auf eine Sammlung:

let data = { name: 'productName', size: 'medium' } 
data.userRef = db.doc('users/' + firebase.auth().currentUser.uid); 
db.collection('products').add(data); 

Hier finden Sie eine Sammlung (Produkte) und alle Verweise auf jedes Dokument (Benutzerdaten):

db.collection('products').get() 
    .then((res) => { 
     vm.mainListItems = []; 
     res.forEach(doc => { 
     var newItem = doc.data(); 
     newItem.id = doc.id; 
     if (newItem.userRef) { 
      newItem.userRef.get() 
      .then(res => { newItem.userData = res.data() }) 
      .catch(err => console.error(err)); 
     } 
     vm.mainListItems.push(newItem); 
     }); 
    }) 
    .catch((err) => { console.error(err) }); 

this helps

+1

Danke für das Teilen! Ich denke, es gibt einen Tippfehler in der ersten Zeile von Get part und es sollte 'db.collection ('products'). Get()' sein. Haben Sie versucht, Benutzer direkt zu bekommen? Ich denke, 'newItem.userRef.get()' sollte funktionieren anstelle von 'db.collection (" Benutzer "). Doc (newItem.userRef.id) .get()' –

+0

Dank @CRG gute Abholung auf dem Tippfehler und Yep guter Punkt auf der userRef.get() statt - das ist eine einfachere sauberer Weg, es zu tun - danke –

+4

Zunächst einmal vielen Dank für das Beispiel. Ich hoffe, sie werden ein "bevölkern: wahr" für die Zukunft hinzufügen. Andernfalls ist das Speichern einer Referenz etwas sinnlos. Das gleiche hätte getan werden können, indem man einfach die "UID" speichert und über sie referenziert. –

Verwandte Themen