it-swarm.com.de

So fügen Sie einem Dokument in Firebase Cloud Firestore eine Unterkollektion hinzu

Die Dokumentation enthält keine Beispiele zum Hinzufügen einer Unterkollektion zu einem Dokument. Ich kann ein Dokument zu einer Sammlung hinzufügen und Daten zu einem Dokument hinzufügen, aber wie füge ich einem Dokument eine Sammlung (Subcollection) hinzu?

Sollte es nicht eine Methode wie diese geben:

dbRef.document("example").addCollection("subCollection")
7
rgoncalv

Angenommen, wir haben eine Chat-Anwendung, die eine Datenbankstruktur hat, die der folgenden ähnelt:

 enter image description here

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

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

Wenn Sie eine messages-Sammlung erstellen und den Aufruf von addDocument () 1000 Mal aufrufen möchten, ist das sicherlich teuer, aber so funktioniert Firestore. Sie können zur Firebase-Echtzeitdatenbank wechseln, wenn Sie möchten, wo die Anzahl der Schreibvorgänge keine Rolle spielt. In Bezug auf Unterstützte Datentypen in Firestore können Sie tatsächlich ein Array verwenden, da dies unterstützt wird. In Firebase-Echtzeitdatenbank können Sie auch eine array verwenden, dies ist jedoch ein Anti-Pattern. Einer der Gründe, warum Firebase die Verwendung von Arrays empfiehlt, ist, dass die Sicherheitsregeln nicht geschrieben werden können.

Cloud Firestore kann Arrays speichern. Das Abfragen von Array-Mitgliedern und das Aktualisieren einzelner Array-Elemente werden nicht unterstützt. Sie können diese Art von Daten jedoch weiterhin modellieren, indem Sie die anderen Funktionen von Cloud Firestore nutzen. Hier ist die Dokumentation wo sehr gut erklärt wird.

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

collection -> document -> subCollection -> document
7
Alex Mamo

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);
  });

Dadurch wird eine Sammlung EnglishWords erstellt, die ein Dokument of enthält. Das Dokument of hat drei Untersammlungen: AudioSources (Aufnahmen des Wortes in amerikanischen und britischen Akzenten), FunFacts und Translations. Die Unterkollektion Translations hat ein Dokument: Spanish. Das Spanish-Dokument hat drei Schlüssel-Wert-Paare, die Ihnen mitteilen, dass 'de' die spanische Übersetzung von 'von' ist.

In der ersten Codezeile wird die Auflistung EnglishWords erstellt. Wir warten auf die Auflösung des Versprechens mit .then und erstellen dann die drei Untersammlungen. Promise.all sagt uns, wann alle drei Untersammlungen eingestellt sind.

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

Ich verwende Sammlungen, wenn ich auf einzelne Elemente, z. B. Dokumente, zugreifen möchte. Bei der älteren Firebase-Echtzeitdatenbank musste ich Arrays herunterladen und dann die Arrays mit forEach durchlaufen, 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 benötigte, und meine App wurde langsamer, forEach-Schleifen auf großen Arrays auszuführen. Firestore stellt die Iteratoren in die Datenbank, an ihrem Ende, so dass ich ein einzelnes Element anfordern kann, und es sendet mir genau dieses Element, wodurch mir Bandbreite gespart und meine App schneller ausgeführt wird. Dies kann für eine Web-App keine Rolle spielen, wenn Ihr Computer über eine Breitbandverbindung verfügt. Bei mobilen Apps mit schlechten Datenverbindungen und langsamen Geräten ist dies jedoch wichtig.

Hier sind zwei Bilder von meinem Firestore:  enter image description here

 enter image description here

1

Hier ist eine Variante, bei der die Unterkollektion ID-Werte auf Sammlungsebene speichert, und nicht innerhalb eines Dokuments, bei dem die Unterkollektion ein Feld mit zusätzlichen Daten ist. 

Dies ist nützlich, wenn Sie ein 1-to-Many-ID-Mapping verbinden möchten, ohne ein zusätzliches Dokument durchgehen zu müssen:

function fireAddStudentToClassroom(studentUserId, classroomId) {

    var db = firebase.firestore();
    var studentsClassroomRef =
        db.collection('student_class').doc(classroomId)
          .collection('students');

    studentsClassroomRef
        .doc(studentUserId)
        .set({})
        .then(function () {
            console.log('Document Added ');
        })
        .catch(function (error) {
            console.error('Error adding document: ', error);
        });
}

Danke an @ Alex Antwort

Diese Antwort ist ein wenig von der ursprünglichen Frage entfernt, in der explizit nach einer Sammlung zu einem Dokument gefragt wird. Nach der Suche nach einer Lösung für dieses Szenario und ohne eine Erwähnung in Docs oder SO zu finden, scheint dieser Beitrag ein vernünftiger Ort für die Weitergabe der Ergebnisse zu sein

1
Gene Bo

zu spät für eine Antwort, aber hier ist, was für mich gearbeitet hat,

        mFirebaseDatabaseReference?.collection("conversations")?.add(Conversation("User1"))
            ?.addOnSuccessListener { documentReference ->
                Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.id)
                mFirebaseDatabaseReference?.collection("conversations")?.document(documentReference.id)?.collection("messages")?.add(Message(edtMessage?.text.toString()))
            }?.addOnFailureListener { e ->
                Log.w(TAG, "Error adding document", e)
            }

fügen Sie Erfolgslistener hinzu, um ein Dokument hinzuzufügen, und verwenden Sie die von der Firebase generierte ID für einen Pfad . Verwenden Sie diese ID für den vollständigen Pfad für eine neue Sammlung, die Sie hinzufügen möchten . I.E. - dbReference.collection ('yourCollectionName'). document (firebaseGeneratedID) .collection ('yourCollectionName'). add (yourDocumentPOJO/Object)

0
Mihir Patel