我试图获取每个子集合(等级)的所有文档,并将平均等级设置为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;
});
答案 0 :(得分:0)
您收到的错误RangeError: Maximum call stack size exceeded
表示您正在代码中的某个位置调用一个函数,该函数又调用另一个函数,依此类推,直到达到调用堆栈限制为止。
如果考虑以下因素,这是有道理的:
Firestore API返回一个DocumentSnapshot
对象,它是一个复杂的对象,其中包含对其他对象的循环引用,因此它会变大。
您将获取每个ratingCount
文档,然后获取每个ratings
的每个ratingCount
文档。
为了解决此问题,您可以限制从ratings
集合中获取的文档数量,可以在此{{3中找到有关如何在Firestore查询中实现limit
的详细信息}},处理需要处理的内容,然后处理下一批文档。