2017-11-13 2 views
0

Ich habe eine Sammlung in Cloud-Firestore-Datenbank Firebase mit Subkollektionen wie so:Wie führe ich mehrere Lesevorgänge in Firebase Cloud Firestore effizient durch?

myCollection 
    doc1 
     statistics 
      doc1 
      doc2 
      doc3 
    doc2 
     statistics 
      doc1 
      doc2 
    doc3 
     statistics 
      doc1 
      doc2 
      doc3 
      doc4 
    doc4 
     statistics 

und so weiter.

Basiert auf einer Abfrage, ich ziehe vielleicht doc1, doc2 und doc4 aus der Sammlung, zum Beispiel. Jetzt muss ich für jede von ihnen ihre jeweiligen Subkollektionen nach relevanten Statistiken abfragen.

Meine Lösung in meiner AngularJS App bisher war:

/** 
* Gets aggregate views for queried docs. 
* @param {![firebase.firestore.DocumentSnapshot]} docs - the queried documents 
*/ 
$scope.getTotalViews = (docs) => { 
    let promises = []; 
    docs.forEach(doc => { 
     promises.push($scope.getTotalDocumentViews(doc.id)); 
    }); 
    $q.all(promises).then(totalViewsArray => { 
     // TODO: Sum the array to get aggregate views for queried documents 
     // Only outputs some of the time 
     console.log(totalViewsArray); 
    }); 
}; 

/** 
* Gets all view statistics from a given document's subcollection. 
*/ 
$scope.getTotalDocumentViews = (id) => { 
    let deferred = $q.defer(); 
    firebase.firestore().collection("myCollection").doc(id).collection("statistics").where("type", "==", "view").get().then(snapshot => { 
     deferred.resolve(snapshot.size); 
    }); 
    return deferred.promise; 
}; 

Das Problem, das ich in laufen lasse, da kann es viele Dokumente, die von der Abfrage auf myCollection zurückgegeben werden, Schleife durch alle diese und ihre Subkollektionen abzufragen scheint grob ineffizient zu sein. Aber nicht nur das, während der obige Code einen Teil der Zeit gelingt es, ein großer Teil der Zeit wirft er den Fehler:

Uncaught (in promise) Error: transaction closed 

Ich habe auch die vielfältigen Untersammlung Abfragen in einer Transaktion durchzuführen versucht, aber das hat Das funktioniert auch nicht, da ich nicht nur ein Dokument abrufe, sondern nach potenziell hunderten aus der Subcollection suche.

Wie kann ich die Untersammlungen einiger Sätze von mehreren Dokumenten effizient abfragen?

Antwort

0

Ich denke, das gleiche gilt hier wie für die meisten anderen NoSQL-Datenbanken (und definitiv die Firebase Realtime Database): Wenn Sie die Anzahl von etwas aus der Datenbank effizient erhalten möchten, sollten Sie diese Anzahl als eine Eigenschaft speichern und aktualisieren Sie es kontinuierlich (in diesem Fall) Ansichten auftreten. Der Versuch, Hunderte von Dokumenten zu lesen, um deren Anzahl zu bestimmen, wird nicht skaliert.

Erwägen Sie daher, jedem Dokument eine -Eigenschaft hinzuzufügen, und erhöhen Sie dies (wahrscheinlich mit einem transaction), während Sie Ansichten aufzeichnen.

+0

Danke! Für alle anderen, die ein Beispiel sehen möchten, wie man dies speziell für Cloud Firestore anwendet, habe ich Folgendes in der Dokumentation gefunden: https://firebase.google.com/docs/firestore/solutions/aggregation – user5489654

+0

Cool! Ich vergesse immer wieder, dass die Dokumente einige dieser Anwendungsfälle abdecken. :) –

Verwandte Themen