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?
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
Cool! Ich vergesse immer wieder, dass die Dokumente einige dieser Anwendungsfälle abdecken. :) –