在Firestore中获取所有可访问子文档的文档

时间:2020-07-19 22:14:25

标签: typescript firebase google-cloud-firestore

我试图获取每个子集合(等级)的所有文档,并将平均等级设置为foobar文档,但是我在可调用函数之一中始终收到此错误:

Unhandled error RangeError: Maximum call stack size exceeded
    at isLength (/srv/node_modules/lodash/lodash.js:11713:22)
    at isArrayLike (/srv/node_modules/lodash/lodash.js:11333:31)
    at keys (/srv/node_modules/lodash/lodash.js:13307:14)
    at /srv/node_modules/lodash/lodash.js:4900:21
    at baseForOwn (/srv/node_modules/lodash/lodash.js:2990:24)
    at Function.mapValues (/srv/node_modules/lodash/lodash.js:13400:7)
    at encode (/srv/node_modules/firebase-functions/lib/providers/https.js:183:18)
    at /srv/node_modules/lodash/lodash.js:13401:38
    at /srv/node_modules/lodash/lodash.js:4905:15
    at baseForOwn (/srv/node_modules/lodash/lodash.js:2990:24) 

代码:

const fooBarQuerySnapshot = await db
    .collection("foobars")
    .orderBy('ratingCount', 'desc')
    .get();

const fooBars = fooBarQuerySnapshot.docs
    .map(async (x: QueryDocumentSnapshot<DocumentData>) => {
        // get foo bar data
        const data = x.data();
        
        // get sub collection of ratings
        const ratingQuerySnapshot = await db
            .collection(collectionName)
            .doc(x.id)
            .collection('ratings')
            .get();
            
        // set avg rating from the subcollection of ratings
        data.avgRating = ratingQuerySnapshot.docs
             .map((y: QueryDocumentSnapshot<DocumentData>) => y.data().rating)
             .reduce((p, c) => p + c, 0) / data.ratingCount;
        return data;
    });

1 个答案:

答案 0 :(得分:0)

您收到的错误RangeError: Maximum call stack size exceeded表示您正在代码中的某个位置调用一个函数,该函数又调用另一个函数,依此类推,直到达到调用堆栈限制为止。

如果考虑以下因素,这是有道理的:

  • Firestore API返回一个DocumentSnapshot对象,它是一个复杂的对象,其中包含对其他对象的循环引用,因此它会变大。

  • 您将获取每个ratingCount文档,然后获取每个ratings的每个ratingCount文档。

为了解决此问题,您可以限制从ratings集合中获取的文档数量,可以在此{{3中找到有关如何在Firestore查询中实现limit的详细信息}},处理需要处理的内容,然后处理下一批文档。