2017-11-27 11 views
1

Die Dokumentation enthält keine Beispiele zum Hinzufügen einer Untersammlung zu einem Dokument. Ich weiß, wie man einer Sammlung Dokumente hinzufügt und einem Dokument Daten hinzufügt, aber wie füge ich einem Dokument eine Sammlung (Untersammlung) hinzu?Hinzufügen von Untersammlungen zu einem Dokument in Firebase Cloud Firestore

Sollte es keine Methode wie dbRef.document("example").addCollection("subCollection") geben?

Antwort

0

Angenommen, wir eine Chat-Anwendung, die eine Datenbankstruktur hat, die dieser recht ähnlich sieht:

enter image description here

Um einen subCollection in einem Dokument zu schreiben, verwenden Sie bitte den folgenden Code ein:

DocumentReference messageRef = db 
    .collection("rooms").document("roomA") 
    .collection("messages").document("message1"); 

Wenn Sie erstellen wollen messages Sammlung und AddDocument() 1000 Mal wird sicher teuer sein, aber so funktioniert Firestore. Sie können zu Firebase Realtime Database wechseln, wenn Sie möchten, wobei die Anzahl der Schreibvorgänge keine Rolle spielt. Aber bezüglich Supported Data Types in Firestore, in der Tat können Sie ein Array verwenden, weil Supported ist. In Firebase Realtime database können Sie auch eine array verwenden, aber das ist ein Anti-Pattern. Einer der vielen Gründe, die Firebase gegen die Verwendung von Arrays empfiehlt, ist, dass die Sicherheitsregeln nicht geschrieben werden können.

Cloud Firestore kann Arrays speichern, es unterstützt nicht die Abfrage von Array-Elementen oder die Aktualisierung einzelner Array-Elemente. Sie können diese Art von Daten jedoch immer noch modellieren, indem Sie die anderen Funktionen von Cloud Firestore nutzen. ist die Dokumentation, wo sehr gut erklärt wird.

Sie können auch keine Subcollection mit 1000 Nachrichten erstellen und alle zur Datenbank hinzufügen und gleichzeitig einen einzelnen Datensatz berücksichtigen. Es wird für jede Nachricht als eine Schreiboperation betrachtet. Insgesamt 1000 Operationen. Das obige Bild zeigt nicht, wie Daten abgerufen werden, zeigt es eine Datenbankstruktur, in der Sie etwas davon haben:

collection -> document -> subCollection -> document 
+0

Wie wollen Sie zum Beispiel Phantasie, das Hinzufügen 1000 Meldungen dynamisch (mit ihrem IDs automatisch generiert wird) in den 'messages' Sammlungen und dann das Hinzufügen diese Sammlung zu dem 'roomA' in einer Abfrage? Ich bin mir ziemlich sicher, dass das Erstellen der 'messages' Sammlung und das Aufrufen von' addDocument() '1000 mal teuer sein wird (in allen Bedeutungen). Ich suche nach einer Möglichkeit, diese Dokumente zu erstellen und sie der Untersammlung lokal zuzuweisen und dann die Untersammlung dem Dokument hinzuzufügen. Ich setze gerade ein Array von Wörterbüchern (oder hashmaps) und setze das Array als Datentyp auf das Dokument ... – rgoncalv

+0

aber das Array von Wörterbüchern klingt nicht die beste Lösung angesichts der Kraft von Firestore. In der Tat zeigt Ihr Bild oben, wie man aus einer Untersammlung (wie in den Dokumenten) abrufen, aber wie eine Untersammlung zu einem Dokument hinzugefügt wird in den Dokumenten überhaupt nicht erklärt :( – rgoncalv

+0

Bitte sehen Sie meine aktualisierte Antwort. –

0

Hier ist mein Code:

firebase.firestore().collection($scope.longLanguage + 'Words').doc($scope.word).set(wordData) 
    .then(function() { 
    console.log("Collection added to Firestore!"); 
    var promises = []; 
    promises.push(firebase.firestore().collection($scope.longLanguage + 'Words').doc($scope.word).collection('AudioSources').doc($scope.accentDialect).set(accentDialectObject)); 
    promises.push(firebase.firestore().collection($scope.longLanguage + 'Words').doc($scope.word).collection('FunFacts').doc($scope.longLanguage).set(funFactObject)); 
    promises.push(firebase.firestore().collection($scope.longLanguage + 'Words').doc($scope.word).collection('Translations').doc($scope.translationLongLanguage).set(translationObject)); 
    Promise.all(promises).then(function() { 
     console.log("All subcollections were added!"); 
    }) 
    .catch(function(error){ 
     console.log("Error adding subcollections to Firestore: " + error); 
    }); 
    }) 
    .catch(function(error){ 
    console.log("Error adding document to Firestore: " + error); 
    }); 

Dies macht eine Sammlung EnglishWords, das hat ein Dokument of. Das Dokument of hat drei Untersammlungen: AudioSources (Aufzeichnungen des Wortes in amerikanischen und britischen Akzenten), FunFacts und Translations. Die Unterkollektion Translations hat ein Dokument: Spanish. Das Dokument Spanish hat drei Schlüssel-Wert-Paare, die Ihnen sagen, dass 'de' die spanische Übersetzung von 'of' ist. Die erste Zeile des Codes erstellt die Sammlung EnglishWords. Wir warten auf die Auflösung des Versprechens mit .then, und dann erstellen wir die drei Untersammlungen. Promise.all sagt uns, wenn alle drei Untersammlungen eingestellt sind.

IMHO, ich verwende Arrays in Firestore, wenn das gesamte Array zusammen hochgeladen und heruntergeladen wird, d. H. Ich muss nicht auf einzelne Elemente zugreifen. Zum Beispiel wäre ein Array der Buchstaben des Wortes "of" ['o', 'f']. Der Benutzer kann fragen: "Wie buchstabiere ich?" Der Benutzer wird nicht fragen: "Was ist der zweite Buchstabe von '?"

Ich verwende Sammlungen, wenn ich auf einzelne Elemente zugreifen muss, z.Mit der älteren Firebase Realtime Database musste ich Arrays herunterladen und dann mit forEach durch die Arrays iterieren, um das gewünschte Element zu erhalten. Dies war eine Menge Code, und mit einer tiefen Datenstruktur und/oder großen Arrays habe ich Tonnen von Daten heruntergeladen, die ich nicht brauchte, und verlangsamte meine App, forEach Schleifen auf großen Arrays laufen zu lassen. Firestore stellt die Iteratoren an deren Ende in die Datenbank, so dass ich ein einzelnes Element anfordern kann und mir nur dieses Element sendet, wodurch ich Bandbreite einbüße und meine App schneller laufen lässt. Dies ist für eine Webanwendung möglicherweise nicht relevant, wenn Ihr Computer über eine Breitbandverbindung verfügt. Für mobile Apps mit schlechten Datenverbindungen und langsamen Geräten ist dies jedoch wichtig.

Hier sind zwei Bilder von meinen Firestor: enter image description here

enter image description here

Verwandte Themen