基本上尝试做一些日常用户管理工作。用户数据库有几千个用户(30ish(,但由于规模的原因,该功能看起来很吃力。
我尽可能地简化了这个函数,是的,我增加了大小和内存限制(540秒,2 GB(。
也许我做错了什么,也许我需要探索一个不同的解决方案,比如Cloud Run或App Engine或更大的解决方案。
module.exports = async (data, context) => {
// Get all of the users in the database
const userQuery = await db.collection('users').get()
let authPromises = []
userQuery.forEach(userDoc => {
authPromises.push(
admin.auth().getUser(userDoc.id).then(userResult => {
return {
metadata: userResult.metadata,
...userDoc.data().arrayOfKeysIWant
}
})
)
})
let authResult = await Promise.all(authPromises)
let signInCount = 0
authResult.forEach(user => {
if (user.metadata.lastRefreshTime) {
signInCount += 1
}
})
console.log(signInCount)
return new Promise((res, rej) => {
res({count: authResult.length, signInCount})
})
}
它绝对不能同时查询所有这些文档并将它们加载到内存中。如果您有一个任意大的文档集合要单独处理,则应该使用分页将查询拆分为多个批次。考虑到文档的内容,你应该做一点数学运算,找出一个合适的页面大小,它合理地适合可用内存。