如何有效地在Firebase Cloud Firestore中执行多次读取?

时间:2017-11-13 00:28:21

标签: angularjs firebase google-cloud-firestore

我在Firebase的Cloud Firestore数据库中有一个集合,其子集如下:

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

等等。

基于查询,我从集合中提取doc1,doc2和doc4,例如。现在,对于其中的每一个,我需要查询各自的子集以获取相关统计信息。

到目前为止,我在AngularJS应用程序中的解决方案是:

/**
 * 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;
};

我遇到的问题是因为myCollection上的查询可能返回许多文档,循环遍历所有这些文档并查询它们的子集合似乎非常低效。不仅如此,虽然上面的代码在某些时候确实成功了,但很多时候它会抛出错误:

Uncaught (in promise) Error: transaction closed

我还尝试在一个事务中执行多个子集合查询,但是由于我不是只检索一个文档,而是从子集合中查询可能有数百个文档,因此效果不佳。

如何有效地查询某些多个文档集的子集?

1 个答案:

答案 0 :(得分:0)

我认为这同样适用于大多数其他NoSQL数据库(当然还有Firebase实时数据库):如果您希望能够有效地从数据库中获取某些内容,则应将该计数存储为属性,连续更新(在这种情况下)视图发生。试图阅读数百个文件只是为了确定它们的数量并不会扩展。

因此,请考虑在每个文档中添加view_count属性,并在录制视图时将其增加(可能使用transaction)。